当searchview获得焦点时,Android appcompat工具栏会拉伸

时间:2015-01-20 10:38:21

标签: android searchview android-toolbar

我正在更新应用以使用新的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没有影响。

Normal state Expanded state Focused state

10 个答案:

答案 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" />