android - 可滚动的 TextView 不允许在应用程序暂停后选择文本
问题描述
我有一个可滚动TextView
的,用户可以在其中选择文本。我通过将移动方法设置为来添加滚动条ScrollingMovementMethod
。
问题:除非应用程序暂停(例如,在切换应用程序之后),否则选择效果很好。一旦应用程序再次处于活动状态,选择就会停止工作,并且我会在日志中收到以下消息:
W/TextView:TextView 不支持文本选择。选择已取消。
我的设置:
我有一个 ActivityCoordinatorLayout
和一个 Fragment ,TextView
它RelativeLayout
看起来像这样:
<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);
因为这是根据this,this和this问题的唯一工作方式。
编辑:
问题出在以下调用中
textView.setMovementMethod(new ScrollingMovementMethod());
如果我删除它,它会起作用,但我不明白为什么。
重现问题的最少步骤:
TextView
1)使用以下布局
创建一个空的活动。
<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)设置TextView
inonStart()
方法的可见性参数。
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())
解决了我的问题,之后功能运行良好。但我不太确定为什么要添加它,我担心如果我删除它会刹车。知道为什么可以ScrollingMovementMethod
与android:scrollbars="vertical"
. 可能是 xml 在某些情况下不起作用?想法?我仍然对为什么使用ScrollingMovementMethod
刹车选择功能感兴趣?
解决方案
请从您的 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 中提到的同样的事情。因此,根据您的要求,我们可以使用它。
推荐阅读
- asp.net-core - Automapper 引用在多层应用程序中应该放在哪里
- java - 拆分“[”和“]”并且标准转义不起作用
- python-3.x - 是否可以在 python 中打开终端并运行应用程序
- angular - 在`Angular`中实现`Refresh Token`
- python - 使用数字 dtype 的均值填充 pandas 列中的 NaN,非数字 dtype 的模式
- laravel-7 - 用户可以通过 http://localhost/ProjectLaravel/.env 访问我的 .env laravel 文件,我还没有找到 .htaccess 文件的解决方案
- android-studio - 如何在 libGdx 中请求访问网络状态、访问 Wifi 状态和 Internet 的权限
- python - 使用 discord.py 重复命令
- python - 将数据从列表写入 csv 文件后,某些列单元格为空
- javascript - 类型“{}”缺少以下属性 - Angular 9.1.1