我正在更新应用以使用新的Toolbar
而不是常规ActionBar
。
在我的应用中,用户必须能够从其联系人列表中选择联系人。为此,我在菜单中添加了SearchView
。
联系人已经在列表中; SearchView
用于使用ArrayAdapter.getFilter()
方法过滤列表。
使用ActionBar
一切正常,但Toolbar
的高度被拉伸到键盘后面。使用Android设备监视器中的XML检查我可以看到键盘后面存在ListView
。
似乎SearchView
似乎想要显示建议,但我没有配置这样的东西。知道出了什么问题吗?
图像说明了问题。它们显示SearchView
的正常,扩展和聚焦状态。
这是我的XML菜单:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_forwarding_contact_search"
app:showAsAction="always"
android:title="@string/forwarding_contact_search"
app:actionViewClass="android.support.v7.widget.SearchView"
android:icon="@drawable/abc_ic_search_api_mtrl_alpha"/>
</menu>
修改
给工具栏一个固定的高度并不能解决问题,因为当焦点有SearchView
时它会消失。更改任一项目的严重性似乎对SearchView
没有影响。
答案 0 :(得分:19)
我遇到了与OP相同的问题,我尝试了android:fitsSystemWindows="true"
解决方案,但它已经解决了一半:搜索视图不再扩展,但通知栏(屏幕顶部)变得完全白色(就像布局一样)背景)而不是红色(我的应用主题)。
我找到了一种替代方式,它的工作方式就像一个魅力,所以对于那些被卡住的人来说,试试这个:
在您的清单中,只需在您的活动部分添加此行:
机器人:windowSoftInputMode = “adjustPan”
示例:
<activity
android:name=".MainActivity"
android:windowSoftInputMode="adjustPan"
android:label="My main activity" >
</activity>
答案 1 :(得分:18)
好的,我明白了。 SearchView
没有问题,因为通常放置在布局xml中的普通EditText
也是如此。 Toolbar
也不是问题。
我创建了一个空的活动,并在我的应用程序中改变了我所做的任何事情,最后来到了我的主题。在KitKat和后来我在主题上设置<item name="android:windowTranslucentStatus">true</item>
,因此导航抽屉将出现在状态栏后面。
禁用/删除此功能可解决此问题。这让我想起了android:fitsSystemWindows="true"
财产。它在Toolbar
上设置,但不在包含DrawerLayout
的主要活动的布局xml中设置。
我想DrawerLayout
设置自己适合系统窗口。
例如。这里没有fitSystemWindows
属性:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".DashboardActivity">
发生问题的活动没有NavigationDrawer
,这是一项新活动。在活动布局的根节点上设置android:fitsSystemWindows="true"
使得工作正常。
因此,对于任何人来说:如果您的主题中有<item name="android:windowTranslucentStatus">true</item>
,请确保包含工具栏的任何根节点都包含android:fitsSystemWindows="true"
。
工作样本:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<include layout="@layout/toolbar" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button" />
</LinearLayout>
</LinearLayout>
答案 2 :(得分:17)
我有同样的问题,但没有帮助上面的答案,但经过大量的搜索发现了一些东西。
也可以帮到你。!!
在toolbar
android:layout_height="?attr/actionBarSize"
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/ToolBarStyle"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/myPrimaryColor"
android:minHeight="@dimen/abc_action_bar_default_height_material" >
<TextView
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="@color/myTextPrimaryColor"
android:layout_gravity="center" />
</android.support.v7.widget.Toolbar>
答案 3 :(得分:3)
接受的答案很好,但我需要一个可以在半透明状态栏下查看工具栏的替代方案。
问题是工具栏使用填充来覆盖系统组件。因此,只要键盘出现,工具栏的paddingBottom就会被设置为软键盘的高度。解决方法是在我的自定义工具栏类中调用super.onMeasure之前重置填充:
public class MyToolbar extends Toolbar {
(...)
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), 0);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
答案 4 :(得分:1)
我在工具栏上的SearchView中遇到了同样的问题,其中包含TextView和Spinner。关闭SearchView(通过按工具栏后退按钮或切换到ViewPager中的其他选项卡)会导致工具栏伸展到键盘顶部的正下方。
我通过在工具栏中的视图周围放置一个额外的布局来解决它。
在:
<android.support.v7.widget.Toolbar
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"/>
<Spinner
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</android.support.v7.widget.Toolbar>
在
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<Spinner
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</android.support.v7.widget.Toolbar>
答案 5 :(得分:1)
我遇到了类似的问题,在搜索菜单项(menu.xml)中设置showAsAction="always|collapseActionView"
为我解决了工具栏的拉伸问题。
答案 6 :(得分:1)
这似乎是一个老问题,但我想解决有关此问题的真正原因。
实际上,fitsSystemWindows不仅将statusBar插图添加到视图填充中,而且还添加了键盘的高度。因此,当显示键盘时,您的工具栏(即使用窗口插图的视图)将获得等于键盘高度的底部填充。
将fitSystemWindows移至根节点确实可以解决此问题,但是有时我们无法做到这一点,例如,我们需要工具栏的背景来填充状态栏。
因此,我认为,解决此问题的真正方法是告诉视图仅消耗顶部插图。幸运的是,Android确实为我们提供了一种方法。
private static final View.OnApplyWindowInsetsListener CONSUME_TOP_INSET_LISTENER = new View.OnApplyWindowInsetsListener() {
@RequiresApi(api = Build.VERSION_CODES.KITKAT_WATCH)
@Override
public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
int b = v.getPaddingBottom();
int l = v.getPaddingLeft();
int r = v.getPaddingRight();
v.setPadding(l, insets.getSystemWindowInsetTop(), r, b);
int il = insets.getSystemWindowInsetLeft();
int ir = insets.getSystemWindowInsetRight();
int ib = insets.getSystemWindowInsetBottom();
return insets.replaceSystemWindowInsets(il, 0, ir, ib);
}
};
public static void makeViewConsumeTopWindowInsetsOnly(@NonNull View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
view.setOnApplyWindowInsetsListener(CONSUME_TOP_INSET_LISTENER);
}
}
将上述代码添加到某个位置,然后在您要使用顶部视图的视图中调用此方法。
答案 7 :(得分:1)
不更改xml并保持半透明系统栏的最简单解决方案是添加: 科特林:
toolbar.setOnApplyWindowInsetsListener { toolbar, windowInsets ->
toolbar.updatePadding(
windowInsets.systemWindowInsetLeft,
windowInsets.systemWindowInsetTop,
windowInsets.systemWindowInsetRight,
0
)
windowInsets.consumeSystemWindowInsets()
}
请检查您的fitsSystemWindows=true
是否正确放置。
答案 8 :(得分:0)
我想分享一下我的经历,但在此之前我想放弃这个评论。到目前为止,我真的发现这个CoordinatorLayout
shenanigans越野车并不值得被放入SDK中。它只是马车。当它的行为不正常时,xml布局上的架构对于弄清楚最新情况并没有太大帮助。我虔诚地追随examples,但没有一个奏效。
话虽如此,我正在使用构建工具版本v24.0.2(撰写本文时的最新版本),我的情况可能与其他情况不同。所以我在这里给出了这个答案和其他答案。
在我的情况下,我使用此library用于NavigationDrawer
正如这里的一些答案所指出的,它是导航抽屉。我尝试不使用该库,但仍然遇到问题。我有CoordinatorLayout
作为我的两个活动的父布局,并按照库作者的指示以编程方式插入NavigationDrawer
。当关注Toolbar
时,屏幕大小的扩展EditText
仍然存在。因此,在我的情况下,问题不是来自那里。
以下是我在案件中所做的事情:
我从活动的fitsSystemWindows
布局中删除了CoordinatorLayout
。与其他人在此提出的建议相反。
我在这里粘贴整个活动布局:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
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/coordinatorlayout_homescreen"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.HomeScreenActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsingtoolbarlayout_homescreen"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginStart="64dp"
app:expandedTitleMarginEnd="48dp"
app:layout_scrollFlags="scroll|enterAlwaysCollapsed">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_homescreen"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:layout_collapseMode="pin"/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<FrameLayout
android:id="@+id/framelayout_homescreen"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.NestedScrollView>
<!--
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab_homescreen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/ic_dialog_email" />
-->
</android.support.design.widget.CoordinatorLayout>
我在另一个活动上做了这个,它按预期工作。我没有扩展Toolbar
了。但是这problem发生了。我准备把头发拉出来。状态栏变为白色。凤凰网在该帖子上的解决方案为我修好了,我引用他的回答:
我在此链接中找到了答案:状态栏颜色不随更改 相对布局作为根元素
所以事实证明我们需要删除
<item name="android:statusBarColor">@android:color/transparent</item> in
styles.xml(V21)。它对我来说很好。
我唯一关心的是这个解决方案在即将到来的更新中将如何运作。 CoordinatorLayout
不应该表现得那样。
答案 9 :(得分:0)
如果您在工具栏中使用EditText,在imeOptions中添加“flagNoExtractUi”将解决拉伸编辑区域。
用于搜索操作的EditText,无需拉伸:
android:id="@+id/toolbar_editText"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:inputType="text"
android:imeOptions="actionSearch|flagNoExtractUi"
android:singleLine="true" />