当键盘切换时,文本会向右跳到中心

时间:2018-01-28 21:58:19

标签: android android-recyclerview

我有一个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"/>

enter image description here

滑动后重新对齐:

enter image description here

编辑:在回收xml部分中删除android:layout_gravity="center_horizontal"无效。

此外,如果屏幕已满而未打开键盘,则文本将移至右侧: enter image description here

2 个答案:

答案 0 :(得分:0)

你能评论detectKeyBoard()函数吗?只是为了检查是否存在同样的问题?

答案 1 :(得分:0)

只是一个猜测 -

我发现您要创建一个新的LayoutParams对象并将其分配给您的mRecyclerViewmLinearInput

据我所知,这个新的LayoutParam对象将取代您在XML中设置的内容,包括layout_gravity, layout_weight 等。

尝试从mRecyclerView和mLinearInput获取现有的LayoutParams,然后修改它们的值。

无法提供太多建议,因为我不太了解在您的情况下重置布局参数的原因。