我有一个RecycleView
,其中我可以看到一些文字。文本通过底部的EditText
视图输入。 RecycleView
包含TextView
,其文本居中。
我还有一个功能,可以检测键盘是否可视化。当键盘可视化时,会更改一些布局参数,以使EditText
看起来很好。我也有一个平滑滚动到RecycleView
的最后位置。
当我再次重新打开键盘时,文本首先被绘制到屏幕左侧。如果我滑动,文本将重新对齐到中心。这是非常令人不安的,我总是希望文本集中。在更改布局参数时,我可能会错过一些东西。
KeyBoard opensListener:
// Function to see of keyboard is opened or not.
private void detectKeyBoard(){
final ConstraintLayout rootView = findViewById(R.id.activity_root);
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
float heightDiff = rootView.getRootView().getHeight() - rootView.getChildAt(0).getHeight();
if (!isRefSet){
refDiff = heightDiff;
isRefSet = true;
}
if (heightDiff > refDiff) {
LinearLayout.LayoutParams params = new
LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
0);
params.weight = wRSmall;
mRecyclerView.setLayoutParams(params);
LinearLayout.LayoutParams eParams = new
LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
0);
eParams.weight = wESmall;
mLinearInput.setLayoutParams(eParams);
if (mAdapter.getItemCount() > 0) {
mRecyclerView.smoothScrollToPosition(mAdapter.getItemCount() - 1);
}
} else {
LinearLayout.LayoutParams params = new
LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
0);
params.weight = wRStart;
mRecyclerView.setLayoutParams(params);
LinearLayout.LayoutParams eParams = new
LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
0);
eParams.weight = wEStart;
mLinearInput.setLayoutParams(eParams);
if (mAdapter.getItemCount() > 0) {
mRecyclerView.smoothScrollToPosition(mAdapter.getItemCount() - 1);
}
}
}
});
}
for RecycleView的xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/activity_root"
tools:context="com.example.erikbylow.autoflash.TranslateActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/translate_linear"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.9"
android:scrollbars="vertical"
android:layout_gravity="center_horizontal"
android:id="@+id/translate_recycle"
android:background="@android:color/holo_blue_bright" />
<LinearLayout
android:layout_width="match_parent"
android:id="@+id/linear_input"
android:layout_height="0dp"
android:layout_weight="0.1"
android:orientation="horizontal">
<EditText
android:layout_width="0dp"
android:layout_weight="0.75"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:singleLine="true"
android:id="@+id/source_input"
android:hint="Type text to translate"/>
<Button
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_weight="0.25"
android:layout_alignRight="@+id/source_input"
android:text="Translate"
android:clickable="true"
android:onClick="startTranslate"
android:background="@android:color/holo_green_dark"/>
</LinearLayout>
</LinearLayout>
TextView for Adapter:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:textSize="@dimen/active_text_size"
android:id="@+id/adapter_textview"/>
滑动后重新对齐:
编辑:在回收xml部分中删除android:layout_gravity="center_horizontal"
无效。
答案 0 :(得分:0)
你能评论detectKeyBoard()函数吗?只是为了检查是否存在同样的问题?
答案 1 :(得分:0)
只是一个猜测 -
我发现您要创建一个新的LayoutParams
对象并将其分配给您的mRecyclerView
和mLinearInput
。
据我所知,这个新的LayoutParam对象将取代您在XML中设置的内容,包括layout_gravity, layout_weight 等。
尝试从mRecyclerView和mLinearInput获取现有的LayoutParams,然后修改它们的值。
无法提供太多建议,因为我不太了解在您的情况下重置布局参数的原因。