我倾向于创建TextView
和EditText
,它们在视觉上看起来像素相同。
我用EditText
覆盖了TextView
,以便可以比较它们的相同性。我使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>
但是,android:lineSpacingMultiplier
随附时,两者的行为有所不同。
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"
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
看起来在视觉上是相同的吗?
请不要建议使用EditText
来代替TextView
。他们是不一样的!您可以采用各种解决方法来尝试使EditText
的行为像TextView
。 (Stackoverflow对解决方法提出了一些建议。它们都无法完美地起作用。)最后,它不起作用!
答案 0 :(得分:1)
奇怪的是,添加
android:inputType="textMultiLine"
或
android:editable="true"
TextView 似乎可以解决问题
这不会使textview真正可编辑,并且实际上没有任何意义,但是它会更改lineSpacingMultiplier
属性的效果。
答案 1 :(得分:1)
EditText
是TextView
的扩展(子类),但是两者在这里的行为有所不同,这当然是原因,因为它们的属性不相同(或者是从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
,它们完全对齐。
因此,基本上,您可以计算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的图像:
答案 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"