Sas*_*ota 8 android textview android-layout
我有一个可滚动TextView的用户可以选择文本.我通过设置移动方法来添加滚动条ScrollingMovementMethod.
问题:除非应用程序暂停(例如,切换应用程序后),否则选择效果很好.一旦应用程序处于活动状态,选择将停止工作,并在日志中收到以下消息:
W/TextView:TextView不支持文本选择.选择取消.
我的设置:
我有一个Activity CoordinatorLayout和一个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" />
Run Code Online (Sandbox Code Playgroud)
在Java代码中,我必须这样做:
textView.setMovementMethod(new ScrollingMovementMethod());
textView.setTextIsSelectable(true);
textView.setFocusable(true);
textView.setFocusableInTouchMode(true);
Run Code Online (Sandbox Code Playgroud)
编辑:
问题出在以下调用中
textView.setMovementMethod(new ScrollingMovementMethod());
Run Code Online (Sandbox Code Playgroud)
如果我删除它有效,但我无法理解.
重现问题的最小步骤:
1)TextView使用以下布局创建一个空的Activity .
<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>Run Code Online (Sandbox Code Playgroud)
2)设置TextViewin onStart()方法的可见性参数.
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);
}
}Run Code Online (Sandbox Code Playgroud)
3)尝试TextView在暂停应用程序之前和之后使用上下文菜单.
编辑2:
删除setMovementMethod(new ScrollingMovementMethod())解决了我的问题,之后功能很好.但是我不太清楚为什么它被添加了,我担心如果我删除它会制造一些东西.知道为什么人们可能会ScrollingMovementMethod结合使用android:scrollbars="vertical".可能是xml在某些情况下不起作用?想法?我仍然对使用ScrollingMovementMethod制动器选择功能感兴趣吗?
设置ScrollingMovementMethod提供了TextView“自行”滚动的能力,例如,当您设置很长的文本并且它在底部或边缘被剪切时。如果ScrollingMovementMethod您可以滚动TextView,则无需将其放置在可滚动容器中,例如ScrollView或HorizontalScrollView
android:scrollbars="vertical"该行表示,如果View获得“滚动性”(例如通过上述移动方法),则 UI 应仅显示vertical滚动条。来自文档:
定义滚动时应显示或不显示哪些滚动条。
它是View文档,不是TextView特别的,因为很少有扩展“种类”的Views 可以获得“可伸缩性”,包括所有ViewGroups ScrollView,如ListView、RecyclerView等。
最后这一行在你的代码中做了什么?你里面setTextIsSelectable有这一行:
setMovementMethod(selectable ? ArrowKeyMovementMethod.getInstance() : null);
Run Code Online (Sandbox Code Playgroud)
所以实际上它的覆盖移动方法你在你自己的代码中设置了上面几行。我敢打赌,不久前你的代码TextView是可以“自行”缩放的,有一天某个聪明的人重写了这个并放入TextViewXMLScrollView中,而移动方法则保留在代码中。
textIsSelectable一直工作到Activity暂停,因为恢复后你(再次)设置ScrollableMovementMethod,但里面setTextIsSelectable你有
if (mEditor.mTextIsSelectable == selectable) return;
Run Code Online (Sandbox Code Playgroud)
您在暂停mTextIsSelectable之前的第一次运行中设置了该标志Activity,并且该标志被恢复,因此下面的代码不会被触发(因此移动方法不会随着ArrowKeyMovementMethod您的ScrollableMovementMethod停留而重新设置)。所以回答这个问题在你的代码中做了什么:它在暂停和恢复后破坏了“可选择性” Activity,除此之外什么也没有
ScrollingMovementMethod注意来自and的来源ArrowKeyMovementMethod:仅在ArrowKeyMovementMethod(像上面一样设置为内部移动方法setTextIsSelectable)中,您覆盖了onTouchEvent方法并在其中处理了一些处理选择的行
编辑:另请注意,setTextIsSelectable您在内部设置了“可聚焦性”,因此这些行是不必要的:
textView.setFocusable(true);
textView.setFocusableInTouchMode(true);
Run Code Online (Sandbox Code Playgroud)
这样你就可以将代码缩短为一行:
textView.setTextIsSelectable(true);
Run Code Online (Sandbox Code Playgroud)
或者删除所有引用的 Java 代码并添加一行 XML:
android:textIsSelectable="true"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
838 次 |
| 最近记录: |