在 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_PARENTWRAP_CONTENT 之前,但在 HorizontalScrollView 中并没有像我希望的那样启用文本换行。

请注意,此 View 包含在 ScrollView 内的 HorizontalScrollView 内,因此默认情况下它会水平和垂直滚动。

希望这对遇到此问题的其他人有所帮助!

编辑: 如果之前启用了文本换行,而您尝试使用这种方法禁用它,文本仍将被换行,因为根据定义,内容已经换行。我能想到的唯一修复方法是完全重新加载 View 及其 ScrollViews。如果您找到其他解决方案,请告诉我。