回答:
アクションバーとステータスバーのカスタマイズに関しては、> = API14のすべてのデバイスで同様に見える必要があるアプリを開発しています。ようやく解決策を見つけました。少し時間がかかったので、それを共有してあなたの解決策をいくつか保存します。まず、appcompat-21依存関係を使用します。
透明なアクションバー:
values / styles.xml:
<style name="AppTheme" parent="Theme.AppCompat.Light">
...
</style>
<style name="AppTheme.ActionBar.Transparent" parent="AppTheme">
<item name="android:windowContentOverlay">@null</item>
<item name="windowActionBarOverlay">true</item>
<item name="colorPrimary">@android:color/transparent</item>
</style>
<style name="AppTheme.ActionBar" parent="AppTheme">
<item name="windowActionBarOverlay">false</item>
<item name="colorPrimary">@color/default_yellow</item>
</style>
values-v21 / styles.xml:
<style name="AppTheme" parent="Theme.AppCompat.Light">
...
</style>
<style name="AppTheme.ActionBar.Transparent" parent="AppTheme">
<item name="colorPrimary">@android:color/transparent</item>
</style>
<style name="AppTheme.ActionBar" parent="AppTheme">
<item name="colorPrimaryDark">@color/bg_colorPrimaryDark</item>
<item name="colorPrimary">@color/default_yellow</item>
</style>
これで、これらのテーマを使用しAndroidManifest.xml
て、透明または色付けするアクティビティを指定できますActionBar
。
<activity
android:name=".MyTransparentActionbarActivity"
android:theme="@style/AppTheme.ActionBar.Transparent"/>
<activity
android:name=".MyColoredActionbarActivity"
android:theme="@style/AppTheme.ActionBar"/>
注:API> = 21でActionbar
透明を取得するには、Statusbar
透明も取得する必要があります。そうしないと、カラースタイルが尊重されず、薄い灰色のままになります。
透明ステータスバー(API> = 19でのみ機能):
これは非常に簡単で、次のコードを使用するだけです。
protected void setStatusBarTranslucent(boolean makeTranslucent) {
if (makeTranslucent) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
} else {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
しかし、ファンキーな結果に気づくでしょう:
これは、Statusbar
が透明の場合、レイアウトがその高さを使用するために発生します。これを防ぐには、次のことを行う必要があります。
SOLUTION ONE:
この行を追加します。android:fitsSystemWindows="true"
あなたはアクションバー怒鳴る置くことにしたいものは何でもあなたのレイアウトビューコンテナに:
...
<LinearLayout
android:fitsSystemWindows="true"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
</LinearLayout>
...
ソリューション2:
前のメソッドに数行追加します。
protected void setStatusBarTranslucent(boolean makeTranslucent) {
View v = findViewById(R.id.bellow_actionbar);
if (v != null) {
int paddingTop = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ? MyScreenUtils.getStatusBarHeight(this) : 0;
TypedValue tv = new TypedValue();
getTheme().resolveAttribute(android.support.v7.appcompat.R.attr.actionBarSize, tv, true);
paddingTop += TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
v.setPadding(0, makeTranslucent ? paddingTop : 0, 0, 0);
}
if (makeTranslucent) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
} else {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
以下R.id.bellow_actionbar
に配置したいもののレイアウトコンテナビューIDはどこにありますかActionbar
。
...
<LinearLayout
android:id="@+id/bellow_actionbar"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
</LinearLayout>
...
これで終わりです。何かを忘れていないと思います。この例では使用しませんでしたToolbar
が、同じ結果になると思います。これは私のカスタマイズ方法ですActionbar
:
@Override
protected void onCreate(Bundle savedInstanceState) {
View vg = getActionBarView();
getWindow().requestFeature(vg != null ? Window.FEATURE_ACTION_BAR : Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(getContentView());
if (vg != null) {
getSupportActionBar().setCustomView(vg, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
getSupportActionBar().setDisplayShowCustomEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(false);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayUseLogoEnabled(false);
}
setStatusBarTranslucent(true);
}
注:これは、
Hope abstract class
を拡張ActionBarActivity
するものです。
MyScreenUtils.getStatusBarHeight(this)
ここに欠けているのが答えですstackoverflow.com/a/3410200/1307690
FLAG_LAYOUT_NO_LIMITS
コードを入れて、旗をgetWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
その後getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
KITKAT以降に対応しています。アクティビティのonCreateメソッド内に次のコードを追加するだけです。マニフェストファイルを変更する必要はありません。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window w = getWindow(); // in Activity's onCreate() for instance
w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
以下のコード行をアクティビティ/フラグメントJavaファイルに追加するだけです。
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
);