我不知道为什么我的滚动视图会发生这种情况。当没有编辑文本聚焦时,布局似乎没问题,如下图所示。
但是当用户恰好位于其中一个编辑文本框中时,工具栏和键盘布局会占用所有空间,将滚动视图隐藏在后面,如图所示
这个布局是:
<?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,但是它既不起作用
答案 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