EditText 在 NestedScrollView 中不可滚动
EditText not scrollable inside NestedScrollView
布局: 我在 NestedScrollView 中有一个 EditText 和 2 个 RecyclerView,它们不可见(visibility=gone)
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
//... toolbar
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.core.widget.NestedScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="?attr/actionBarSize"
android:fillViewport="true"
android:scrollbars="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:backgroundTint="@android:color/transparent"
android:gravity="top"
android:inputType="textMultiLine|textCapSentences"
android:padding="@dimen/activity_margin"
android:singleLine="false" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_items"
android:padding="@dimen/activity_margin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:scrollbars="vertical"
android:visibility="gone" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_Labels"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="12dp"
android:visibility="gone" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</LinearLayout>
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/coordinator_layout"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_gravity="bottom"
android:layout_marginBottom="?actionBarSize" />
<com.google.android.material.bottomnavigation.BottomNavigationView
//...
/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
问题: 当我输入的文本超过屏幕高度时,EditText 会向下滚动到光标所在的位置。但是当我尝试向上滚动时,什么也没有发生。 Here's a screen recording I made.
无法滚动:
- 第一次 entering/pasting 长文本后。
可以滚动:
- 重新打开 activity 并输入文本后
- 关闭键盘后
- 关闭键盘再打开后
搜索类似问题得到:
- EditText not scrollable inside ScrollView
- Enable Scrollable EditText within a ScrollView and ViewFlipper
- ...和其他答案相同的结果:
...
editText.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (v.getId() == R.id.editText) {
v.getParent().requestDisallowInterceptTouchEvent(true);
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_UP:
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
}
return false;
}
});
该解决方案不起作用:
- 问题是关于 ScrollViews,而不是 NestedScrollViews。 NestedScrollView 是建议的解决方案之一(我已经在使用)
- 当我添加上面的代码时,EditText 有点可滚动,但只有在显示键盘时才会滚动。如果不是,则无法滚动 - 尝试滚动会导致选择文本。
- 滚动(打开键盘)移动光标。
如果您需要更多信息或者我遗漏了什么,请告诉我。谢谢!
答案其实比我想的要简单。
粘贴您的 xml 后(并对其进行必要的更改以构建它 - 缺少维度等...)我只是将您的 EditText
的高度更改为 wrap_content
并且错误消失了.
答案就在这里:
比较EditText
在不同时间点的测量值,左边是height=match_parent
,右边是height=wrap_content
左边:
EditText
以一定大小绘制在空屏幕上,您粘贴文本,它的大小不会改变。 Showing/Hiding 键盘 是屏幕生命周期中的一个重要事件,它被称为 配置更改 这会导致再次测量元素和 re-drawn.
右边:
如果您将 EditText
的高度更改为 wrap_content
,它将在插入后立即强制测量和 re-draw。
希望这对您有所帮助:)
设置activity为,
android:windowSoftInputMode="adjustResize"
布局: 我在 NestedScrollView 中有一个 EditText 和 2 个 RecyclerView,它们不可见(visibility=gone)
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
//... toolbar
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.core.widget.NestedScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="?attr/actionBarSize"
android:fillViewport="true"
android:scrollbars="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:backgroundTint="@android:color/transparent"
android:gravity="top"
android:inputType="textMultiLine|textCapSentences"
android:padding="@dimen/activity_margin"
android:singleLine="false" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_items"
android:padding="@dimen/activity_margin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:scrollbars="vertical"
android:visibility="gone" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_Labels"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="12dp"
android:visibility="gone" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</LinearLayout>
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/coordinator_layout"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_gravity="bottom"
android:layout_marginBottom="?actionBarSize" />
<com.google.android.material.bottomnavigation.BottomNavigationView
//...
/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
问题: 当我输入的文本超过屏幕高度时,EditText 会向下滚动到光标所在的位置。但是当我尝试向上滚动时,什么也没有发生。 Here's a screen recording I made.
无法滚动:
- 第一次 entering/pasting 长文本后。
可以滚动:
- 重新打开 activity 并输入文本后
- 关闭键盘后
- 关闭键盘再打开后
搜索类似问题得到:
- EditText not scrollable inside ScrollView
- Enable Scrollable EditText within a ScrollView and ViewFlipper
- ...和其他答案相同的结果:
...
editText.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (v.getId() == R.id.editText) {
v.getParent().requestDisallowInterceptTouchEvent(true);
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_UP:
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
}
return false;
}
});
该解决方案不起作用:
- 问题是关于 ScrollViews,而不是 NestedScrollViews。 NestedScrollView 是建议的解决方案之一(我已经在使用)
- 当我添加上面的代码时,EditText 有点可滚动,但只有在显示键盘时才会滚动。如果不是,则无法滚动 - 尝试滚动会导致选择文本。
- 滚动(打开键盘)移动光标。
如果您需要更多信息或者我遗漏了什么,请告诉我。谢谢!
答案其实比我想的要简单。
粘贴您的 xml 后(并对其进行必要的更改以构建它 - 缺少维度等...)我只是将您的 EditText
的高度更改为 wrap_content
并且错误消失了.
答案就在这里:
比较EditText
在不同时间点的测量值,左边是height=match_parent
,右边是height=wrap_content
左边:
EditText
以一定大小绘制在空屏幕上,您粘贴文本,它的大小不会改变。 Showing/Hiding 键盘 是屏幕生命周期中的一个重要事件,它被称为 配置更改 这会导致再次测量元素和 re-drawn.
右边:
如果您将 EditText
的高度更改为 wrap_content
,它将在插入后立即强制测量和 re-draw。
希望这对您有所帮助:)
设置activity为,
android:windowSoftInputMode="adjustResize"