首页 > 解决方案 > 可滚动的 TextView 不允许在应用程序暂停后选择文本

问题描述

我有一个可滚动TextView的,用户可以在其中选择文本。我通过将移动方法设置为来添加滚动条ScrollingMovementMethod

问题:除非应用程序暂停(例如,在切换应用程序之后),否则选择效果很好。一旦应用程序再次处于活动状态,选择就会停止工作,并且我会在日志中收到以下消息:

W/TextView:TextView 不支持文本选择。选择已取消。

我的设置:

我有一个 ActivityCoordinatorLayout和一个 Fragment ,TextViewRelativeLayout看起来像这样:

<TextView
    android:id="@+id/text_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:scrollbars="vertical" />

在Java代码中我必须这样做:

textView.setMovementMethod(new ScrollingMovementMethod());
textView.setTextIsSelectable(true);
textView.setFocusable(true);
textView.setFocusableInTouchMode(true);

因为这是根据thisthisthis问题的唯一工作方式。

编辑:

问题出在以下调用中

textView.setMovementMethod(new ScrollingMovementMethod());

如果我删除它,它会起作用,但我不明白为什么。

重现问题的最少步骤:

TextView1)使用以下布局 创建一个空的活动。

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text_view"
        android:text="Some very very very long text..."
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:scrollbars="vertical" />

</android.support.design.widget.CoordinatorLayout>

2)设置TextViewinonStart()方法的可见性参数。

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        super.onStart();
        TextView textView = findViewById(R.id.text_view);
        textView.setMovementMethod(new ScrollingMovementMethod());
        textView.setTextIsSelectable(true);
        textView.setFocusable(true);
        textView.setFocusableInTouchMode(true);
    }
}

3)尝试TextView在暂停应用程序之前和之后使用上下文菜单。

编辑2:

删除setMovementMethod(new ScrollingMovementMethod())解决了我的问题,之后功能运行良好。但我不太确定为什么要添加它,我担心如果我删除它会刹车。知道为什么可以ScrollingMovementMethodandroid:scrollbars="vertical". 可能是 xml 在某些情况下不起作用?想法?我仍然对为什么使用ScrollingMovementMethod刹车选择功能感兴趣?

标签: androidandroid-layouttextview

解决方案


请从您的 XML 中替换以下代码。

<TextView
    android:id="@+id/text_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:enabled="true"
    android:textIsSelectable="true"
    android:focusable="true"
    android:longClickable="true" 
    android:scrollbars="vertical" />

从程序中删除以下代码:

textView.setTextIsSelectable(true);
textView.setFocusable(true);
textView.setFocusableInTouchMode(true);

setTextIsSelectable()方法的内部代码:

public void setTextIsSelectable(boolean selectable) {
        if (!selectable && mEditor == null) return; // false is default value with no edit data

        createEditorIfNeeded();
        if (mEditor.mTextIsSelectable == selectable) return;

        mEditor.mTextIsSelectable = selectable;
        setFocusableInTouchMode(selectable);
        setFocusable(FOCUSABLE_AUTO);
        setClickable(selectable);
        setLongClickable(selectable);

        // mInputType should already be EditorInfo.TYPE_NULL and mInput should be null

        setMovementMethod(selectable ? ArrowKeyMovementMethod.getInstance() : null);
        setText(mText, selectable ? BufferType.SPANNABLE : BufferType.NORMAL);

        // Called by setText above, but safer in case of future code changes
        mEditor.prepareCursorControllers();
    }

以编程方式,他们也在做我在 XML 中提到的同样的事情。因此,根据您的要求,我们可以使用它。


推荐阅读