android - 显示键盘时,viewpager fragment 内的 ScrollView 不会滚动

标签 android android-edittext scrollview window-soft-input-mode

我有一个布局内容如下的 Activity :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:background="?attr/colorPrimary"
     android:minHeight="?attr/actionBarSize"
     style="@style/ToolBarStyle.Event" />

    <com.mypackage.corecode.ui.view.SlidingTabLayout
        android:id="@+id/sliding_tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/primary_color" />

    <android.support.v4.view.ViewPager
        android:id="@+id/vendor_main_tabview_pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>

在 viewpager 中,我有一个具有以下布局的 fragment :

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:weightSum="3"
                        android:orientation="horizontal">

                        <EditText
                            android:theme="@style/ScrollableContentThemeNoActionBar"
                            android:id="@+id/edit_text_vendor_sms_phone_number"
                            android:layout_width="0dp"
                            android:layout_weight="2"
                            android:layout_height="wrap_content"
                            android:inputType="number" />

                        <Button
                            android:id="@+id/button_send_sms"
                            android:layout_width="0dp"
                            android:layout_weight="1"
                            android:layout_height="wrap_content"
                            />
                    </LinearLayout>
         </LinearLayout>
 </ScrollView>

当 fragment 中的内容不适合屏幕时, ScrollView 允许用户看到屏幕下方的内容。 (按预期工作)

问题是当 edittext 获得焦点时,键盘与 edittext 区域重叠,而不是 scrollview 导致内容滚动。

我希望 fragment 能够处理显示的键盘和 ScrollView 以适应屏幕上的键盘。

或者我错了, Activity 负责键盘吗? Activity布局中的root view是linearlayout,是不是限制了展开?

我尝试用 ScrollView 包裹 Activity 布局的全部内容,但这次如果我不给它固定大小,viewpager 不会出现在屏幕上。 即使我这样做了,我最终还是在 fragment 中有一个 ScrollView ,该 fragment 位于主布局的 ScrollView 下方,并且键盘仍然悬停在编辑文本上。

我在这里有点迷路,我的目标是在编辑文本获得焦点时能够滚动 fragment 内容,但键盘当前与编辑文本重叠。

最佳答案

我可能会弄错,但这可能是因为已知的 Android 错误,您只需要将下一个类添加到您的项目中:

public class AndroidBug5497Workaround {

    // For more information, see https://code.google.com/p/android/issues/detail?id=5497
    // To use this class, simply invoke assistActivity() on an Activity that already has its content view set.

    public static void assistActivity (Activity activity) {
        new AndroidBug5497Workaround(activity);
    }

    private View mChildOfContent;
    private int usableHeightPrevious;
    private FrameLayout.LayoutParams frameLayoutParams;

    private AndroidBug5497Workaround(Activity activity) {
        FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
        mChildOfContent = content.getChildAt(0);
        mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                possiblyResizeChildOfContent();
            }
        });
        frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
    }

    private void possiblyResizeChildOfContent() {
        int usableHeightNow = computeUsableHeight();
        if (usableHeightNow != usableHeightPrevious) {
            int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
            int heightDifference = usableHeightSansKeyboard - usableHeightNow;
            if (heightDifference > (usableHeightSansKeyboard/4)) {
                // keyboard probably just became visible
                frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
            } else {
                // keyboard probably just became hidden
                frameLayoutParams.height = usableHeightSansKeyboard;
            }
            mChildOfContent.requestLayout();
            usableHeightPrevious = usableHeightNow;
        }
    }

    private int computeUsableHeight() {
        Rect r = new Rect();
        mChildOfContent.getWindowVisibleDisplayFrame(r);
        return (r.bottom - r.top);
    }

}

然后只需在包含 ViewPagerSlidingTabLayout 的 Activity 中调用 assistActivity() 方法即可使用它:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(...);
    AndroidBug5497Workaround.assistActivity(this);
    ...
}

更多背景调查 this线程。

关于android - 显示键盘时,viewpager fragment 内的 ScrollView 不会滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35142251/

相关文章:

java - Android - 键盘没有出现在 float 窗口中

android - EditText OnKeyListener 不工作

android - Android Studio中的Gradle同步错误

Android-获取当前位置但经纬度返回0.0(计算错误)

安卓多屏不兼容

android - 在Android中更改滚动条颜色

Android:如何在聚焦时将 ScrollView 中的 EditText 放在另一个 View 上方?

SwiftUI:使用 anchor 调用 scrollTo 方法时崩溃:.center

android - NFC 水龙头计数器

android - 在 flutter 中导入下拉依赖项 : ^ 1. 0.2 时出现问题