web-dev-qa-db-ja.com

Android searchcomviewがフォーカスを取得するとappcompatツールバーが伸びる

通常のToolbarではなく新しいActionBarを使用するようにアプリを更新しています。私のアプリでは、ユーザーは連絡先リストから連絡先を選択できる必要があります。そのために、メニューにSearchViewを追加しました。連絡先は既にリストに含まれています。 SearchViewは、 ArrayAdapter.getFilter() メソッドを使用してリストをフィルタリングするために使用されます。

ActionBarを使用するとすべて正常に機能しましたが、Toolbarの高さはキーボードのすぐ後ろまで伸びています。 Android Device Monitorの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 stateExpanded stateFocused state

20
ar34z

わかりました。レイアウトxml内に通常配置される通常のSearchViewsでも同じことが起こったため、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>
19
ar34z

OPと同じ問題が発生したので、Android:fitsSystemWindows="true"解決策ですが、半分は解決されました。検索ビューが拡大しなくなりましたが、通知バー(画面の上部)が赤(アプリのテーマ)ではなく完全に白(レイアウトの背景のように)になりました。

私は別の方法を見つけ、それが魅力のように機能しているので、行き詰まっている人はこれを試してください:

マニフェストで、次の行をアクティビティセクションに追加します。

Android:windowSoftInputMode = "adjustPan"

例:

<activity
    Android:name=".MainActivity"
    Android:windowSoftInputMode="adjustPan"
    Android:label="My main activity" >
</activity>
19
Rob

私はこのような同じ問題を抱えていましたが、上記の回答は役に立ちませんでしたが、多くの検索で何かが見つかりました。

あなたも助けるかもしれません!!

この属性を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>
17
Kishore Jethava

受け入れられた回答は問題なく機能しますが、半透明のステータスバーの下にツールバーを表示できる代替手段が必要でした。

問題は、ツールバーがパディングを使用してシステムコンポーネントをカバーすることです。その結果、キーボードが表示されるたびに、ツールバーの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);
    }
}
3
zilinx

xmlを変更せずに半透明のシステムバーを維持しない最も簡単な解決策は、kotlinを追加することです。

toolbar.setOnApplyWindowInsetsListener { toolbar, windowInsets ->
    toolbar.updatePadding(
        windowInsets.systemWindowInsetLeft, 
        windowInsets.systemWindowInsetTop,
        windowInsets.systemWindowInsetRight,
        0
    )
    windowInsets.consumeSystemWindowInsets()
}

fitsSystemWindows=trueは正しく配置されています。

1
Filipkowicz

TextViewとSpinnerが含まれているツールバーのSearchViewでも同じ問題が発生しました。 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>
1
Simon Raes

私は同様の問題に遭遇し、showAsAction="always|collapseActionView"検索メニュー項目(menu.xml)内で、ツールバーの拡大を解決しました。

1
Pfennigbaum

古い質問のようですが、この問題の本当の原因に対処したいと思います。

実際、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);
    }
}

上記のコードをどこかに追加し、トップインセットを使用するビューでこのメソッドを呼び出します。

1
ZumiKua

私の経験を共有したいと思いますが、その前にこのコメントを削除したいと思います。これまでのところ、このCoordinatorLayout shenanigansはバグが多く、SDKにドロップする価値がありません。そのバギー。このように不規則に動作する場合、xmlレイアウトのアーキテクチャは、何が起こっているのかを理解するのにあまり役立ちません。私は examples を忠実に追っていましたが、どれもうまくいきませんでした。

そうは言っても、私はビルドツールバージョンv24.0.2(この記事の執筆時点で最新)を使用しており、私の状況は他の状況とは異なる場合があります。だから私はここに他の答えと一緒にこの答えを入れています。

私の場合、私はこれを使用しています library NavigationDrawer

ここでいくつかの答えが指摘したように、そのナビゲーションドロワー。そのライブラリを使用しないようにしても問題が解決しませんでした。私は2つのアクティビティの親レイアウトとして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の拡張はもうありません。しかし、これ 問題 が発生しました。髪を抜こうとしています。ステータスバーが白くなった。その投稿のフェニックス王の解決策は私のためにそれを修正し、私は彼の答えを引用します:

私はこのリンクで答えを見つけました:ルート要素としての相対レイアウトでステータスバーの色が変化しない

だから私たちは削除する必要があることが判明

  <item name="Android:statusBarColor">@Android:color/transparent</item> in

styles.xml(v21)。そして、それは私にとってはうまくいきます。

私の唯一の懸念は、今後のアップデートでこのソリューションがどのように機能するかです。 CoordinatorLayoutはそのように動作してはなりません。

0
Neon Warge

ツールバー内で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" />
0
Brian K.