私のAndroidアプリでは、ソフトキーボードのadjustResize
動作を使用することが重要です。そのため、ユーザーは「続行」などの他のUI要素までスクロールダウンできます。ボタン。
adjustResize
は、マニフェスト設定とAndroid:fitsSystemWindows="true"
の両方がレイアウトルート要素にある場合にのみ機能することに気づきました。 (私が間違っている場合は私を訂正してください!)
しかし、Android:fitsSystemWindows="true"
を使用すると、ツールバーはステータスバーの後ろに配置されなくなります。これは完全に理にかなっていますが、私が望んでいることではありません。
ツールバーがその後ろにあるとき、ステータスバーは私のツールバーの色の一致する暗い色合いを持っています。 Android:fitsSystemWindows="true"
で持っているのは、無色のステータスバーと、必要な値より24dp低い位置にあるツールバーです。
adjustResize
キーボードの動作のために、一致する色のステータスバーをあきらめます。しかし、私の質問は、両方を持つことは可能ですか? 私は美しさとアクセシビリティの両方を夢見ていますか?
経験豊富な人は、設定の魔法の組み合わせを知っていますか?または、回避策として、ステータスバーに明示的に色を付ける方法はありますか?
fyi:
これらはRelativeLayoutルート要素を持つアクティビティであり、それらの一部にはListView
sとEditText
sがあります。
ツールバーはAndroid.support.v7.widget.Toolbar
です
関連する可能性のあるスタイルアイテム:
<style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="Android:windowContentOverlay">@null</item>
PS-ソフトキーボードの動作に関する似たような質問を何十も読みましたが、ツールバーへの意図しない効果に役立つものを見つけることができませんでした。また、その逆に、ツールバー/ステータスバーの動作に関する多くのスタイルの質問がありますが、一見関連性はありません。それでもなお、何かを逃した場合は申し訳ありません!
よろしくお願いします!
編集
Android:fitsSystemWindows="true"
を削除してScrollViewを追加したり、すべてを同じScrollViewに入れようとしたりしてきました。これは何もしません。
Android:fitsSystemWindows="true"
を削除すると、UIの下部が画面の下部に「接着」されます。代わりに、ソフトキーボードの上部に接着するように「サイズ変更」されません。マニフェストに設定されたadjustResize
。
ルートビューでAndroid:fitsSystemWindows="true"
を設定すると、UIのサイズが予想どおりに変更されますが、ツールバーがstatusBarの後ろに描画されなくなります。
だから私はまだ正確に私が始めたところです:(
レイアウトXMLコードサンプルの追加:
<Android.support.design.widget.CoordinatorLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/root"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<!-- CoordinatorLayout because this view uses SnackBars -->
<!-- Relative Layout to lock "continue" button bar to bottom -->
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<!-- Main content, that scrolls with or without keyboard -->
<!-- Correctly sits behind transparent Status Bar -->
<Android.support.v4.widget.NestedScrollView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:paddingBottom="@dimen/footer_persistent_height">
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<!-- ACTUAL VIEWS DELETED FOR BREVITY / CLARITY -->
</RelativeLayout>
</Android.support.v4.widget.NestedScrollView>
<!-- Bottom nav bar -->
<!-- Correctly sits at bottom of UI when keyboard is not visible -->
<!-- PROBLEM: Not accessible when soft keyboard is visible -->
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
style="?android:attr/buttonBarStyle">
<Button
Android:id="@+id/skip_button"
Android:theme="@style/ButtonContinueGrey"
Android:onClick="skipClickHandler"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_weight=".5"
style="?android:attr/buttonBarButtonStyle"/>
<Button
Android:id="@+id/button_progress"
Android:theme="@style/ButtonContinueColored"
Android:onClick="continueClickHandler"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_weight=".5"
style="?android:attr/buttonBarButtonStyle"/>
</LinearLayout>
</RelativeLayout>
</Android.support.design.widget.CoordinatorLayout>
(私自身の質問に答える)
これはAndroidのバグのようです: https://code.google.com/p/Android/issues/detail?id=63777
上記のバグレポートへの投稿は、カスタムレイアウトクラスやカスタムソフトキーボードの作成など、いくつかの推奨される回避策にリンクしています。
すでにこれで十分な時間を無駄にしているような気がします。したがって、私の解決策は、ステータスバーに手動で色を付けることです。
解決:
セットする Android:fitsSystemWindows="true"
レイアウトのルートビューまたはグローバルにstyle.xmlのいずれか。これにより(マニフェストのadjustResizeとともに)、UIがソフトキーボードの上に縮小されるため、UIがブロックされることはありません。これが最も重要なことです。
ステータスバーに色を付けます。これは、Lollypop以降でのみ可能です。とにかく、これは透過的なStatusBarと同じです。
private void updateStatusBarColor(){
// Check Version
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
// OPTIONAL: Calculate a darker version of the toolbar color
int color = calculateDarkerColor(toolBarColor);
// Get the statusBar
Window window = getWindow();
// You can't color a transparent statusbar
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// Set the color
window.setStatusBarColor(color);
}
}
// Calculate a darker version of a given color
// Note I do this because the color always changes, if it's always the same I would save the darker version as a Resource in colors.xml
private int calculateDarkerColor(int color){
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
hsv[2] *= 0.8f; // smaller = darker
return Color.HSVToColor(hsv);
}
私はOSでうまくいくように見える解決策を見つけました。最初のセットfitSystemWindows = true
ウィンドウに反応させたいビューに移動し、上部のパディングを無視するように指示します。
ViewCompat.setOnApplyWindowInsetsListener(yourView, (view, insets) ->
ViewCompat.onApplyWindowInsets(yourView,
insets.replaceSystemWindowInsets(insets.getSystemWindowInsetLeft(), 0,
insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom()))
);
詳細はこちら: https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec
レイアウトをスクロールビューに保ち、Android:fitsSystemWindows = "true"を削除し、サイズ変更の調整のみを使用するようにしてください
Android:fitsSystemWindows = "false"の場合、「adjustResize」の代わりに「adjustPan」を使用してみてください。わたしにはできる。
私はあなたの質問をきちんと得られませんでした、しかし私が問題を解決するために理解できる限り-
パディングの問題については、追加してみてください
Android:fitsSystemWindows="true"
Android:clipToPadding=”false”
そして、透明なステータスバーに追加します
<item name="Android:statusBarColor">@Android:color/transparent</item>
appThemeに。それが休息に役立つことを願って、詳細な問題ビューのためにあなたの問題のスクリーンショットをアップロードしてください。
透明なステータスバーとadjustResizeキーボードの動作の両方を実現するために私がうまくいったことは次のとおりです。
まず、Chris Banesによるこの27分間のドロイドコントークをご覧になることをお勧めします。それは啓発的である可能性があります: https://www.youtube.com/watch?v=_mGDMVRO3iE
レイアウトで、fitsSystemWindowsを正しいレベルに追加して、背景画像がステータスバーの下に広がるようにします。これで、fitsSystemWindowsは、adjustResizeに関連するキーボードレイアウトの動作を修正します。
<FrameLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<ImageView
Android:layout_width="match_parent"
Android:layout_height="match_parent"/>
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true">
<!-- EditText etc here -->
アクティビティ:
makeStatusBarTransparent(this);
setContentView(R.layout.activity_login);
拡張メソッド:
fun Activity.makeStatusBarTransparent() {
window.apply {
clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
decorView.systemUiVisibility += View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
// or:
// decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
statusBarColor = Color.TRANSPARENT
}
}
マニフェストのアクティビティタグ:
Android:windowSoftInputMode="adjustResize|stateHidden"
「.systemUiVisibility + = ...」を実行することにしました。これにより、xmlを介してテーマにwindowLightStatusBarなどを設定できます(さまざまなフレーバーでオーバーライドします)。ただし、LIGHT_STATUS_BARフラグを直接指定することもできます(背景によっては指定しないこともできます)。
FitsSystemWindowsはパディングをオーバーライドするため、パディングを使用する場合は別のレイアウトを使用する必要があることに注意してください。
それは私のために働いています。
マニフェスト.xmlで、これを<activity>
タグに入れます。
Android:windowSoftInputMode="adjustResize"
レイアウトの親タグにこれを入れます。
Android:fitsSystemWindows="true"
Android:clipToPadding="false"
Styles.xmlにこれを入れます。
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="Android:windowTranslucentStatus">true</item>
<item name="Android:windowTranslucentNavigation">true</item>
私はminSdkVersion16とtargetSdkVersion26でこれを行いました