通常の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
には影響がないようです。
わかりました。レイアウトxml内に通常配置される通常のSearchView
sでも同じことが起こったため、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>
OPと同じ問題が発生したので、Android:fitsSystemWindows="true"
解決策ですが、半分は解決されました。検索ビューが拡大しなくなりましたが、通知バー(画面の上部)が赤(アプリのテーマ)ではなく完全に白(レイアウトの背景のように)になりました。
私は別の方法を見つけ、それが魅力のように機能しているので、行き詰まっている人はこれを試してください:
マニフェストで、次の行をアクティビティセクションに追加します。
Android:windowSoftInputMode = "adjustPan"
例:
<activity
Android:name=".MainActivity"
Android:windowSoftInputMode="adjustPan"
Android:label="My main activity" >
</activity>
私はこのような同じ問題を抱えていましたが、上記の回答は役に立ちませんでしたが、多くの検索で何かが見つかりました。
あなたも助けるかもしれません!!
この属性を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>
受け入れられた回答は問題なく機能しますが、半透明のステータスバーの下にツールバーを表示できる代替手段が必要でした。
問題は、ツールバーがパディングを使用してシステムコンポーネントをカバーすることです。その結果、キーボードが表示されるたびに、ツールバーの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);
}
}
xmlを変更せずに半透明のシステムバーを維持しない最も簡単な解決策は、kotlinを追加することです。
toolbar.setOnApplyWindowInsetsListener { toolbar, windowInsets ->
toolbar.updatePadding(
windowInsets.systemWindowInsetLeft,
windowInsets.systemWindowInsetTop,
windowInsets.systemWindowInsetRight,
0
)
windowInsets.consumeSystemWindowInsets()
}
fitsSystemWindows=true
は正しく配置されています。
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>
私は同様の問題に遭遇し、showAsAction="always|collapseActionView"
検索メニュー項目(menu.xml)内で、ツールバーの拡大を解決しました。
古い質問のようですが、この問題の本当の原因に対処したいと思います。
実際、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);
}
}
上記のコードをどこかに追加し、トップインセットを使用するビューでこのメソッドを呼び出します。
私の経験を共有したいと思いますが、その前にこのコメントを削除したいと思います。これまでのところ、この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
はそのように動作してはなりません。
ツールバー内で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" />