Java 如何使android:lineSpacingMultiplier在EditText和TextView中的行为相同

Java 如何使android:lineSpacingMultiplier在EditText和TextView中的行为相同,java,android,android-edittext,Java,Android,Android Edittext,我倾向于创建TextView和EditText,它们在视觉上看起来完全相同 我将编辑文本与文本视图叠加,以便比较它们的相同内容。我使TextView具有红色文本 到目前为止,这就是他们的样子 EditText和TextView在没有android:lineSpacingMultiplier的情况下看起来完全相同 这是正在使用的XML <FrameLayout android:layout_width="match_parent" android:layout_height

我倾向于创建
TextView
EditText
,它们在视觉上看起来完全相同

我将
编辑文本
文本视图
叠加,以便比较它们的相同内容。我使
TextView
具有红色文本

到目前为止,这就是他们的样子

EditText
TextView
在没有
android:lineSpacingMultiplier的情况下看起来完全相同

这是正在使用的XML

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/body_text_view"
        android:gravity="top"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:layout_marginBottom="12dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/transparent"
        android:textSize="24sp"
        android:singleLine="false"
        android:textColor="#ff0000" />
    <EditText
        android:id="@+id/body_edit_text"
        android:gravity="top"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:layout_marginBottom="12dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/transparent"
        android:scrollbars="vertical"
        android:textSize="24sp"
        android:singleLine="false"
        android:inputType="textMultiLine|textCapSentences" />
</FrameLayout>
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/body_text_view"
        android:gravity="top"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:layout_marginBottom="12dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/transparent"
        android:textSize="24sp"
        android:singleLine="false"
        android:textColor="#ff0000"
        android:lineSpacingMultiplier="2.4" />
    <EditText
        android:id="@+id/body_edit_text"
        android:gravity="top"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:layout_marginBottom="12dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/transparent"
        android:scrollbars="vertical"
        android:textSize="24sp"
        android:singleLine="false"
        android:inputType="textMultiLine|textCapSentences"
        android:lineSpacingMultiplier="2.4" />
</FrameLayout>

我可以知道,如何使android:lineSpacingMultiplier对
EditText
TextView
的行为相同,以便
EditText
TextView
在视觉上看起来相同吗

p/s
请不要建议使用
EditText
代替
TextView
。他们不一样!您可以通过各种方法尝试使
EditText
的行为类似于
TextView
。(Stackoverflow在解决方案上有很多建议。没有一个能完美地工作)在一天结束时,它不起作用

不要使用
lineSpacingMultiplier
,而是使用
lineSpacingExtra
并简单地用要在代码中应用的乘法器计算

能够在我的机器上复制您的问题,实际上
lineSpacingMultiplier
产生了与您所面临的问题相同的问题,并且找不到任何解决方案/原因来解释为什么会发生这种情况(甚至在Android文档上也没有)

但是,当我将其更改为相同的
lineSpacingExtra
,例如:
lineSpacingExtra=20dp
它们完全对齐。

因此,基本上,您可以为
EditText
TextView
计算所需的间距,并通过如下代码应用该值:

float calculatedValue = 50.0f;
editText.setLineSpacing(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, calculatedValue,  getResources().getDisplayMetrics()), 1.0f);
textView.setLineSpacing(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, calculatedValue,  getResources().getDisplayMetrics()), 1.0f);
这种方法对我很有效,即使在我使用
calculatedValue
时,两个元素的文本总是完美对齐。

这是我最后使用的xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:layout_width="match_parent"

    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
        android:id="@+id/body_text_view"
        android:gravity="top"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:layout_marginBottom="12dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/transparent"
        android:textSize="24sp"
        android:singleLine="false"
        android:textColor="#ff0000"
        android:lineSpacingExtra="0dp"/>
    <EditText
        android:id="@+id/body_edit_text"
        android:gravity="top"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:layout_marginBottom="12dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/transparent"
        android:scrollbars="vertical"
        android:textSize="24sp"
        android:singleLine="false"
        android:inputType="textMultiLine|textCapSentences"
        android:lineSpacingExtra="0dp"/>

</FrameLayout>

EditText
TextView
上行距均设置为50的图像:


不要使用
lineSpacingMultiplier
,使用
lineSpacingExtra
,只需c计算要在代码中应用的乘法器

能够在我的机器上复制您的问题,实际上
lineSpacingMultiplier
产生了与您所面临的问题相同的问题,并且找不到任何解决方案/原因来解释为什么会发生这种情况(甚至在Android文档上也没有)

但是,当我将其更改为相同的
lineSpacingExtra
,例如:
lineSpacingExtra=20dp
它们完全对齐。

因此,基本上,您可以为
EditText
TextView
计算所需的间距,并通过如下代码应用该值:

float calculatedValue = 50.0f;
editText.setLineSpacing(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, calculatedValue,  getResources().getDisplayMetrics()), 1.0f);
textView.setLineSpacing(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, calculatedValue,  getResources().getDisplayMetrics()), 1.0f);
这种方法对我很有效,即使在我使用
calculatedValue
时,两个元素的文本总是完美对齐。

这是我最后使用的xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:layout_width="match_parent"

    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
        android:id="@+id/body_text_view"
        android:gravity="top"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:layout_marginBottom="12dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/transparent"
        android:textSize="24sp"
        android:singleLine="false"
        android:textColor="#ff0000"
        android:lineSpacingExtra="0dp"/>
    <EditText
        android:id="@+id/body_edit_text"
        android:gravity="top"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:layout_marginBottom="12dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/transparent"
        android:scrollbars="vertical"
        android:textSize="24sp"
        android:singleLine="false"
        android:inputType="textMultiLine|textCapSentences"
        android:lineSpacingExtra="0dp"/>

</FrameLayout>

EditText
TextView
上行距均设置为50的图像:

lineSpacingExtra和2dp对我来说很好,但我想知道乘法器的作用是什么`
`
第二种方式非android:lineSpacingMultiplier=“”使用LineSpacingExtra代替种子lineSpacingMultiplier
android:lineSpacingExtra=“1.5dp”
lineSpacingExtra和2dp对我来说很好,但我想知道乘法器的作用是什么`
`
第二种方式非android:lineSpacingMultiplier=“”使用LineSpacingExtra代替种子lineSpacingMultiplier
android:lineSpacingExtra=“1.5dp”
奇怪的是

android:inputType="textMultiLine"

对于文本视图来说,似乎解决了这个问题

这并不能使textview真正可编辑,事实上也没有意义,但它改变了
lineSpacingMultiplier
属性的效果

android:inputType="textMultiLine"

对于文本视图来说,似乎解决了这个问题


这并不能使textview真正可编辑,事实上也没有意义,但它改变了
lineSpacingMultiplier
属性的效果。

EditText
textview
的一个扩展(子类),然而,这两种方法在这里的行为不同,这当然是,因为它们的属性不相似(从xml设置或默认情况下不相似)。因此,要将它们完美地对齐,唯一的方法是查找可能导致问题的不相似属性,并使它们的行为相似。
考虑到“我可以知道,如何使android:lineSpacingMultiplier对EditText和TextView的行为相同,以便EditText和TextView在视觉上看起来相同吗?”是您主要关心的问题, 通过更改
TextView
的以下属性,我可以将它们完美地对齐

android:可编辑

如果设置,则指定此TextView具有输入方法。除非另有规定,否则将采用文本形式。对于TextView,默认情况下这是false。对于EditText,默认情况下为true

此属性已被弃用,但可以替换为

android:inputType

放置在文本字段中的数据类型,用于帮助输入法决定如何允许用户输入文本。此处的常量与InputType定义的常量相对应。不过,通常可以选择单个值
android:breakStrategy="simple"
android:textIsSelectable="true"