在 Android 中禁用文本换行
Disable text wrapping in Android
我正在 Android 中开展一个项目,其中我有一个 TextView
(确切地说是 EditText
)和一个为该视图启用或禁用文本换行的设置.我已经在互联网上搜索了(很多),但仍然没有找到任何令人满意的解决方案。
目前我正在使用 NestedScrollView
进行垂直滚动,然后动态插入两个部分布局之一,第一个仅包含 EditText
,第二个包含 EditText
包裹在一个 HorizontalScrollView
里面。问题是我目前每次从另一个 return 重新启动 activity 以确保我不会不小心将两个 children 添加到 NestedScrollView
(导致例外)。此外,解释这一点的代码似乎有点笨重和混乱。
第一个局部布局:
<com.example.application.EditorView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/editor_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:layout_gravity="start|top"
android:importantForAutofill="no"
android:inputType="textMultiLine|textCapSentences"
android:padding="@dimen/def_padding"
android:textIsSelectable="true"
android:textSize="18sp"
tools:ignore="LabelFor,ScrollViewSize" />
第二个:
<android.widget.HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/hscroll"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.application.EditorView
android:id="@+id/editor_content"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="start|top"
android:background="@android:color/transparent"
android:importantForAutofill="no"
android:inputType="textMultiLine|textCapSentences"
android:padding="@dimen/def_padding"
android:textIsSelectable="true"
android:textSize="18sp"
tools:ignore="LabelFor,ScrollViewSize" />
</android.widget.HorizontalScrollView>
(EditorView
只是扩展了 EditText
,绝不会影响布局)
我还发现 EditText
有一个 setHorizontallyScrolling(true)
方法,但是当用户滑动时使用它我没有得到滑动效果,我认为这感觉不太用户友好。
说了这么多,我的问题是:在 Android 中,有没有办法动态地 启用 文本在 HorizontalScrollView
内换行,或者有一个选项可以切换它本机包含在(自定义)EditText
?
我终于找到了一个像样的解决方案!基本上,在我的自定义 View
中,每当发生配置更改并启用换行时,我都会将宽度设置为屏幕宽度(我也在 View
首次初始化时设置它):
@Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (/* line wrapping enabled */)
setWidth(Resources.getSystem().getDisplayMetrics().widthPixels);
else setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
}
这之所以有效,是因为在我的例子中,EditText
填满了整个屏幕,因此将宽度设置为所需值非常容易。在我尝试使用 MATCH_PARENT
和 WRAP_CONTENT
之前,但在 HorizontalScrollView
中并没有像我希望的那样启用文本换行。
请注意,此 View
包含在 ScrollView
内的 HorizontalScrollView
内,因此默认情况下它会水平和垂直滚动。
希望这对遇到此问题的其他人有所帮助!
编辑: 如果之前启用了文本换行,而您尝试使用这种方法禁用它,文本仍将被换行,因为根据定义,内容已经换行。我能想到的唯一修复方法是完全重新加载 View
及其 ScrollViews
。如果您找到其他解决方案,请告诉我。
我正在 Android 中开展一个项目,其中我有一个 TextView
(确切地说是 EditText
)和一个为该视图启用或禁用文本换行的设置.我已经在互联网上搜索了(很多),但仍然没有找到任何令人满意的解决方案。
目前我正在使用 NestedScrollView
进行垂直滚动,然后动态插入两个部分布局之一,第一个仅包含 EditText
,第二个包含 EditText
包裹在一个 HorizontalScrollView
里面。问题是我目前每次从另一个 return 重新启动 activity 以确保我不会不小心将两个 children 添加到 NestedScrollView
(导致例外)。此外,解释这一点的代码似乎有点笨重和混乱。
第一个局部布局:
<com.example.application.EditorView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/editor_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:layout_gravity="start|top"
android:importantForAutofill="no"
android:inputType="textMultiLine|textCapSentences"
android:padding="@dimen/def_padding"
android:textIsSelectable="true"
android:textSize="18sp"
tools:ignore="LabelFor,ScrollViewSize" />
第二个:
<android.widget.HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/hscroll"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.application.EditorView
android:id="@+id/editor_content"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="start|top"
android:background="@android:color/transparent"
android:importantForAutofill="no"
android:inputType="textMultiLine|textCapSentences"
android:padding="@dimen/def_padding"
android:textIsSelectable="true"
android:textSize="18sp"
tools:ignore="LabelFor,ScrollViewSize" />
</android.widget.HorizontalScrollView>
(EditorView
只是扩展了 EditText
,绝不会影响布局)
我还发现 EditText
有一个 setHorizontallyScrolling(true)
方法,但是当用户滑动时使用它我没有得到滑动效果,我认为这感觉不太用户友好。
说了这么多,我的问题是:在 Android 中,有没有办法动态地 启用 文本在 HorizontalScrollView
内换行,或者有一个选项可以切换它本机包含在(自定义)EditText
?
我终于找到了一个像样的解决方案!基本上,在我的自定义 View
中,每当发生配置更改并启用换行时,我都会将宽度设置为屏幕宽度(我也在 View
首次初始化时设置它):
@Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (/* line wrapping enabled */)
setWidth(Resources.getSystem().getDisplayMetrics().widthPixels);
else setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
}
这之所以有效,是因为在我的例子中,EditText
填满了整个屏幕,因此将宽度设置为所需值非常容易。在我尝试使用 MATCH_PARENT
和 WRAP_CONTENT
之前,但在 HorizontalScrollView
中并没有像我希望的那样启用文本换行。
请注意,此 View
包含在 ScrollView
内的 HorizontalScrollView
内,因此默认情况下它会水平和垂直滚动。
希望这对遇到此问题的其他人有所帮助!
编辑: 如果之前启用了文本换行,而您尝试使用这种方法禁用它,文本仍将被换行,因为根据定义,内容已经换行。我能想到的唯一修复方法是完全重新加载 View
及其 ScrollViews
。如果您找到其他解决方案,请告诉我。