如何在 EditText 随着文本增长时向上移动视图以及如何在片段中的软键盘顶部保留视图或布局?

How to move the views up while EditText grows with text AND how to retain a view or layout just on top of soft keyboard in fragment?

我有几个 EditTexts 和一个 Camera and Camcorder ImageViews。

1).我希望 Camera 和 Camcorder 在 EditTexts 获得焦点时打开软键盘时位于软键盘的顶部。
2).此外,使用此布局,当用户在 editTextUserMessage 视图中输入的文本增长时,视图会向键盘下方的底部增长。相反,我希望它长大,以便微调器和其他 EditText 可以向上移动。在实现这一点的同时,我希望 1) 发生……也就是说,我希望 imageCamera 和 imageVideo ImageViews 位于键盘之上。

我在 activity 和片段中尝试了不同的 softInputModes.. 但我没有看到我想要的任何改进。
虽然 看起来很有前途,但仅当焦点发生变化时才会将视图保持在键盘顶部,因此此代码无法始终将 Cam 和 Camcorder 图像保持在键盘顶部。

All soultions 只是将整个布局向上移动,这不是我想要的。另外,这不是 activity 而是片段。
你能帮助我吗 ?

下面是我的片段布局:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/linearRootInScroll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:orientation="vertical"
        android:paddingBottom="@dimen/padding_bottom">

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginBottom="10dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="10dp"
            android:orientation="vertical">

            <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_marginLeft="5dp"
                android:orientation="horizontal">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_gravity="center"
                    android:gravity="center"
                    android:text="@string/prefix_type"
                    android:textAppearance="?android:attr/textAppearanceMedium" />

                <Spinner
                    android:id="@+id/spinnerTypes"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:dropDownWidth="wrap_content"
                    android:padding="8dp" />

            </LinearLayout>

            <com.test.shield.views.SearchFriendCompletionView
                android:id="@+id/editTextAddFriend"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/underline_edittext"
                android:gravity="left|center"
                android:hint="@string/hint_add_friend"
                android:imeOptions="actionDone"
                android:minHeight="58dp"
                android:paddingLeft="5dp"
                android:paddingRight="5dp"
                android:scrollbars="vertical"
                android:textColorHint="@color/LIGHT_BLACK" />

            <EditText
                android:id="@+id/editTextUserMessage"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:background="@drawable/underline_edittext"
                android:gravity="left"
                android:hint="@string/hint_message"
                android:inputType="textCapSentences|textMultiLine"
                android:isScrollContainer="true"
                android:maxLength="140"
                android:minHeight="120dp"
                android:padding="5dp"
                android:scrollbars="vertical"
                android:textColorHint="@color/LIGHT_BLACK" />

            <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/linearCamAndVideo"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="start"
                android:orientation="horizontal">

                <ImageView
                    android:id="@+id/imageCamera"
                    android:layout_width="40dp"
                    android:layout_height="40dp"
                    android:layout_marginRight="5dp"
                    android:background="?attr/selectableItemBackground"
                    android:padding="10dp"
                    android:scaleType="center"
                    android:src="@drawable/ic_photo_camera_black_24dp" />

                <ImageView
                    android:id="@+id/imageVideo"
                    android:layout_width="40dp"
                    android:layout_height="40dp"
                    android:background="?attr/selectableItemBackground"
                    android:padding="10dp"
                    android:scaleType="center"
                    android:src="@drawable/ic_videocam_black_24dp" />

            </LinearLayout>

            <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="15dp"
                android:gravity="start"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/textTime"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textColor="@color/black" />

            </LinearLayout>
        </LinearLayout>

        <ImageView
            android:id="@+id/imageMap"
            android:layout_width="match_parent"
            android:layout_height="150dp"
            android:layout_gravity="center"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:padding="7dp"
            android:paddingBottom="5dp"
            android:scaleType="centerCrop" />
    </LinearLayout>
</ScrollView>

好吧,我必须付出足够的努力才能做到这一点。

对于 2) 让 EditText 向上增长以便光标可见的修复是在我上面的布局膨胀的片段的 onCreateView() 中添加这一行:
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

我尝试在 activity 的清单中应用相同的位,但它没有用。

对于 1),当 LinearLayout 具有 Camera 和 Camcorder 时,它会保持在 Keyboard 的顶部。以下是完美运行的解决方案。查看代码中的注释以了解它:

/*
- LinearCamAndVideo is the one I want to keep on top of soft Keyboard when it is visible.
Without this code, mLinearCamAndVideo will be obscured under Keyboard.

- int mInitialLayoutHeight holds no of pixels that layout is growing when it is changed while user enters text. It grows
when user enters key to next line. This globalListener will be called for every change that happens in Layout.

- mRootLayout is root layout in above layout.

- mLinearRootInScroll is root in Scrollview */
mOnGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        if (!isRemoving()) {
            Rect r = new Rect();
            mRootLayout.getWindowVisibleDisplayFrame(r);

            int screenHeight = mRootLayout.getRootView().getHeight();

            //top of the screen starts with 0, bottom being max number of pixels which is height of screen too.
            int heightDifference = screenHeight - (r.bottom - r.top);

            mKeyboardVisible = heightDifference > (screenHeight / 3);
            if (mInitialLayoutHeight == 0) {
                mInitialLayoutHeight = mLinearCamAndVideo.getBottom();
            }

            mLayoutHeightGrown = mLinearCamAndVideo.getBottom() - mInitialLayoutHeight;

            if (mKeyboardVisible) {
                int layoutBottom = mLinearCamAndVideo.getBottom();
                int padding = heightDifference - layoutBottom + mLayoutHeightGrown;

                /*Setting padding to the parent layout in ScrollView is key as it provides
                enough extra space so that scrollTo() can move up the mLinearCamAndVideo layout. You do this only when KB is visible.*/
                mLinearRootInScroll.setPadding(0, 0, 0, padding + Math.round(Converter.convertDpToPixels(getContext(), 30)));
                mScrollView.scrollTo(0, layoutBottom);
            } else {
                   // Reset the padding when Keyboard is no more visible..
                   mLinearRootInScroll.setPadding(0, 0, 0, 0);
                mScrollView.scrollTo(0, r.top);
            }
        }

    }
};
mRootLayout.getViewTreeObserver().addOnGlobalLayoutListener(mOnGlobalLayoutListener);