如何使android:lineSpacingMultiplier对于EditText和TextView的行为相同

时间:2019-01-07 13:51:48

标签: java android android-edittext

我倾向于创建TextViewEditText,它们在视觉上看起来像素相同。

我用EditText覆盖了TextView,以便可以比较它们的相同性。我使TextView带有红色文本。

这是到目前为止的样子。

EditTextTextView在没有android:lineSpacingMultiplier的情况下看起来相同

enter image description here

这是正在使用的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>

但是,android:lineSpacingMultiplier随附时,两者的行为有所不同。

EditTextTextViewandroid:lineSpacingMultiplier

看起来有所不同

enter image description here

这是正在使用的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"
        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在EditTextTextView上的行为相同,以便EditTextTextView看起来在视觉上是相同的吗?

p / s

请不要建议使用EditText来代替TextView。他们是不一样的!您可以采用各种解决方法来尝试使EditText的行为像TextView。 (Stackoverflow对解决方法提出了一些建议。它们都无法完美地起作用。)最后,它不起作用!

5 个答案:

答案 0 :(得分:1)

奇怪的是,添加

android:inputType="textMultiLine"

android:editable="true"

TextView 似乎可以解决问题

这不会使textview真正可编辑,并且实际上没有任何意义,但是它会更改lineSpacingMultiplier属性的效果。

答案 1 :(得分:1)

EditTextTextView的扩展(子类),但是两者在这里的行为有所不同,这当然是原因,因为它们的属性不相同(或者是从xml设置的,还是默认情况下是不相似的) )。因此,完美对齐它们的唯一方法是寻找那些可能导致问题并使其表现相似的不相似属性。
考虑到“我可以知道,如何使android:lineSpacingMultiplier在EditText和TextView上的行为相同,以便EditText和TextView在外观上看起来相同?” , 我可以通过更改TextView的以下属性来使其完美对齐。

As stated in this document (TextView class).

  

android:editable

     

如果设置,则指定此TextView具有输入法。除非另有说明,否则它将为文本格式。对于TextView,默认情况下为 false 。对于EditText,默认情况下为 true

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

  

android:inputType

     

放置在文本字段中的数据类型,用于帮助输入法确定如何让用户输入文本。这里的常数对应于InputType定义的常数。通常,您可以选择一个值,尽管有些值可以按照指示组合在一起。 将此属性设置为除 none 以外的任何内容,还意味着该文本是可编辑的。

要使它高效运行,请使用textMultiLine,因为您的EditText具有相同的属性。

  

android:breakStrategy

     

设置将段落拆分为行的拆分策略。 TextView的默认值为Layout.BREAK_STRATEGY_HIGH_QUALITY,而EditText的默认值为Layout.BREAK_STRATEGY_SIMPLE,后者是为了避免文本在编辑时“跳舞”。

简而言之,添加

android:inputType="textMultiLine"
android:breakStrategy="simple"

移至TextView会将它们完全放在同一位置。

答案 2 :(得分:0)

使用lineSpacingMultiplier而不是使用lineSpacingExtra,只需使用要在代码中应用的乘数c 即可。

能够在您的计算机上复制您的问题,而实际上lineSpacingMultiplier也会遇到与您同样的问题,并且找不到任何解决方案/理由发生(甚至在Android文档上也没有)

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

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

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>

EditTextTextView上行距都设置为50的图像:

Image with line spacing set to 50 on both <code>EditText</code> And <code>TextView</code>:

答案 3 :(得分:0)

    lineSpacingExtra with 2dp worked fine for me but I was wondering what the Multiplier does instead?`<?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
        android:layout_height="match_parent">
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <TextView
                android:lineSpacingMultiplier="1.5"
                android:text="An editable text view that shows completion suggestions ... When you define an edit text widget, you must specify the R.styleable. .... android:lineSpacingMultiplier"
                android:id="@+id/body_text_view"
                android:gravity="top"
                android:paddingLeft="16dp"
                android:paddingRight="16dp"
                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:lineSpacingMultiplier="1.5"
                android:text="An editable text view that shows completion suggestions ... When you define an edit text widget, you must specify the R.styleable. .... android:lineSpacingMultiplier"
                android:gravity="top"
                android:paddingLeft="16dp"
                android:paddingRight="16dp"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@android:color/transparent"
                android:textSize="24sp"
                android:singleLine="false"
                android:textColor="#000000" />


        </FrameLayout>
    </android.support.constraint.ConstraintLayout>`



2nd way Not  android:lineSpacingMultiplier=" " use LineSpacingExtra insteed   LineSpacingMultiplier

 android:lineSpacingExtra="1.5dp"



  <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:lineSpacingExtra="1.5dp"
            android:text="An editable text view that shows completion suggestions ... When you define an edit text widget, you must specify the R.styleable. .... android:lineSpacingMultiplier DD"
            android:id="@+id/body_text_view"
            android:gravity="top"
            android:paddingLeft="16dp"
            android:paddingRight="16dp"
            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:lineSpacingExtra="1.5dp"
            android:text="An editable text view that shows completion suggestions ... When you define an edit text widget, you must specify the R.styleable. .... android:lineSpacingMultiplier D"
            android:gravity="top"
            android:paddingLeft="16dp"
            android:paddingRight="16dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/transparent"
            android:textSize="24sp"
            android:singleLine="false"
            android:textColor="#000000" />


    </FrameLayout>
</android.support.constraint.ConstraintLayout>

答案 4 :(得分:0)

TextView中应用以下2个解决了我的问题

android:breakStrategy="simple"
android:textIsSelectable="true"