ScrollView被工具栏覆盖

时间:2016-12-24 18:11:03

标签: android xml layout scrollview toolbar

我不知道为什么我的滚动视图会发生这种情况。当没有编辑文本聚焦时,布局似乎没问题,如下图所示。

enter image description here

但是当用户恰好位于其中一个编辑文本框中时,工具栏和键盘布局会占用所有空间,将滚动视图隐藏在后面,如图所示

enter image description here

这个布局是:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:id="@+id/activity_meal_viewer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/light_gray"
    android:orientation="vertical">


    <include
        android:id="@+id/tool_bar"
        layout="@layout/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

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

        <android.support.v7.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/activity_horizontal_margin"
            android:background="@android:color/white">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:padding="@dimen/activity_horizontal_margin">


                <EditText
                    android:id="@+id/person_name"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="@dimen/activity_horizontal_margin"
                    android:background="@drawable/generic_shape_rect"
                    android:drawableLeft="@drawable/ic_people"
                    android:drawablePadding="@dimen/activity_horizontal_margin"
                    android:drawableStart="@drawable/ic_people"
                    android:gravity="center_vertical"
                    android:hint="@string/full_name"
                    android:inputType="textPersonName"
                    android:maxLines="1"
                    android:typeface="serif" />

                <EditText
                    android:id="@+id/person_address"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/generic_shape_rect"
                    android:drawableLeft="@drawable/ic_pin"
                    android:drawablePadding="@dimen/activity_horizontal_margin"
                    android:drawableStart="@drawable/ic_pin"
                    android:gravity="center_vertical"
                    android:hint="@string/address"
                    android:inputType="text"
                    android:maxLines="1"
                    android:typeface="serif" />

            </LinearLayout>
        </android.support.v7.widget.CardView>

        <android.support.v7.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/activity_horizontal_margin"
            android:layout_marginLeft="@dimen/activity_horizontal_margin"
            android:layout_marginRight="@dimen/activity_horizontal_margin"
            android:layout_marginTop="0dp"
            android:background="@android:color/white"
            app:cardCornerRadius="2dp">


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:padding="@dimen/activity_horizontal_margin">

                <EditText
                    android:id="@+id/person_email"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="@dimen/activity_horizontal_margin"
                    android:background="@drawable/generic_shape_rect"
                    android:drawableLeft="@drawable/ic_email"
                    android:drawablePadding="@dimen/activity_horizontal_margin"
                    android:drawableStart="@drawable/ic_email"
                    android:ems="10"
                    android:hint="@string/email"
                    android:inputType="textEmailAddress"
                    android:maxLines="1"
                    android:typeface="serif" />


                <EditText
                    android:id="@+id/person_phone"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/generic_shape_rect"
                    android:drawableLeft="@drawable/ic_telephone"
                    android:drawablePadding="@dimen/activity_horizontal_margin"
                    android:drawableStart="@drawable/ic_telephone"
                    android:ems="10"
                    android:hint="@string/phone"
                    android:inputType="phone"
                    android:typeface="serif" />
            </LinearLayout>


        </android.support.v7.widget.CardView>

        <android.support.v7.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/activity_horizontal_margin"
            android:layout_marginLeft="@dimen/activity_horizontal_margin"
            android:layout_marginRight="@dimen/activity_horizontal_margin"
            android:layout_marginTop="0dp"
            android:background="@android:color/white"
            app:cardCornerRadius="2dp">


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:padding="@dimen/activity_horizontal_margin">


                <EditText
                    android:id="@+id/person_initial_fund"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/generic_shape_rect"
                    android:drawableLeft="@drawable/ic_dollar"
                    android:drawablePadding="@dimen/activity_horizontal_margin"
                    android:drawableStart="@drawable/ic_dollar"
                    android:ems="10"
                    android:hint="@string/initial_fund"
                    android:inputType="numberSigned"
                    android:maxLines="1"
                    android:typeface="serif" />
            </LinearLayout>


        </android.support.v7.widget.CardView>

        <ImageButton
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:layout_gravity="center"
            android:layout_marginBottom="@dimen/activity_horizontal_margin"
            android:layout_marginLeft="@dimen/activity_horizontal_margin"
            android:layout_marginRight="@dimen/activity_horizontal_margin"
            android:layout_marginTop="0dp"
            android:background="@drawable/selector_button_accent"
            android:contentDescription="@string/done"
            android:onClick="handlePeople"
            android:src="@drawable/ic_action_done" />
    </LinearLayout>
</LinearLayout>

,工具栏布局文件为:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:fitsSystemWindows="true"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
  

注意:我也尝试过NestesScrollView,但是它既不起作用

2 个答案:

答案 0 :(得分:2)

默认情况下,在视图上使用fitsSystemWindows时,系统提供的WindowInsets会被View用作填充,这就是为什么您的工具栏有额外费用的原因在顶部空间,系统因为透明状态栏而接收到WindowInsets时会添加一些topPadding。

但是,当键盘出现时,系统会抛出一个新的WindowInsets,其键盘高度为底部插入。而且,由于您的工具栏会对这个新的WindowInsets做出反应,因此工具栏会将键盘的高度添加为底部填充,因此会像截图一样增长。

如果您想解决此问题,您有2个解决方案: 首先,使键盘跨越活动的内容,而不是调整活动的大小。您可以通过设置活动的清单条目来执行此操作:

<activity
        android:name=".YourActivity"
        android:windowSoftInputMode="adjustPan"/>

这将使键盘将所有内容推到顶部,确保在键盘启动时EditText仍然可见。但是当键盘启动时,这可以将工具栏推到窗口外面。您可以决定是否合适。

如果您还不行,可以编写一些代码来手动处理WindowInset,以仅将顶部填充应用于工具栏并忽略底部插入。 你可以这样做:

ViewCompat.setOnApplyWindowInsetsListener(toolbar, new OnApplyWindowInsetsListener() {
    @Override
    public WindowInsetsCompat onApplyWindowInsets(
        View v, WindowInsetsCompat insets
    ) {
        v.setPadding(0, insets.getSystemWindowInsetTop(), 0, 0);
        insets.consumeSystemWindowInsets();
        return insets;
    }
});

但请注意,即使此代码将在任何API级别编译和运行(它使用来自support-v4的东西),这只会在API 21及之后,当他们改变WindowInsets的方式时才有效作品。 如果您使用API​​ 19中的transparentStatusBar,则必须编写更多代码以使用已弃用的API执行相同的操作... 我倾向于忽略这一点,并且只允许透明的StatusBar从API 21开始,更不用说正确地处理它了。

希望这有帮助。

答案 1 :(得分:1)

也许你应该使用来自谷歌支持设计的CoordinatorLayout而不是LinearLayout。并添加工具栏内部AppBarLayout。 文档为this