Ich habe ein paar Nachforschungen zu diesem Thema angestellt und konnte keine vollständige Lösung finden. Daher finde ich Schritt für Schritt und mit einigem Ausprobieren heraus, wie wir diese Ergebnisse erzielen können: mit einem transparenten oder farbigen Actionbar
und Statusbar
. Siehe meine Antwort unten.
Ich entwickle eine App, die auf allen Geräten mit> = API14 ähnlich aussehen muss, wenn es um die Anpassung der Aktionsleiste und der Statusleiste geht. Ich habe endlich eine Lösung gefunden und da es ein bisschen Zeit in Anspruch nahm, teile ich sie, um einige von Ihnen zu retten. Wir beginnen mit einer appcompat-21-Abhängigkeit.
Transparente Aktionsleiste:
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>
Jetzt können Sie diese Themen in Ihrem AndroidManifest.xml
um festzulegen, welche Aktivitäten transparent oder farbig sein sollen ActionBar
:
<activity
Android:name=".MyTransparentActionbarActivity"
Android:theme="@style/AppTheme.ActionBar.Transparent"/>
<activity
Android:name=".MyColoredActionbarActivity"
Android:theme="@style/AppTheme.ActionBar"/>
Hinweis: Um in API> = 21 das Actionbar
transparent zu machen, müssen Sie auch das Statusbar
transparent machen. Andernfalls werden Ihre Farbstile nicht berücksichtigt und bleiben hellgrau.
Transparente Statusleiste (funktioniert nur mit API> = 19):
Dies ist ziemlich einfach, benutze einfach den folgenden Code:
protected void setStatusBarTranslucent(boolean makeTranslucent) {
if (makeTranslucent) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
} else {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
Aber du wirst ein irres Ergebnis bemerken:
Dies liegt daran, dass das Layout seine Höhe verwendet, wenn Statusbar
transparent ist. Um dies zu verhindern, müssen wir nur:
LÖSUNG 1:
Diese Zeile hinzufügen Android:fitsSystemWindows="true"
in Ihrem Layout-Ansichtscontainer, was auch immer Sie unter der Actionbar platzieren möchten:
...
<LinearLayout
Android:fitsSystemWindows="true"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
...
</LinearLayout>
...
LÖSUNG ZWEI:
Fügen Sie unserer vorherigen Methode einige Zeilen hinzu:
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);
}
}
Wo R.id.bellow_actionbar
ist die Ansichts-ID des Layout-Containers für alles, was unter dem Actionbar
platziert werden soll:
...
<LinearLayout
Android:id="@+id/bellow_actionbar"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
...
</LinearLayout>
...
Das ist es also, ich denke, ich werde nichts vergessen. In diesem Beispiel habe ich kein Toolbar
verwendet, aber ich denke, es wird dasselbe Ergebnis haben. So passe ich mein Actionbar
an:
@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);
}
Hinweis: Dies ist ein abstract class
das erweitert ActionBarActivity
Ich hoffe es hilft!
Es unterstützt nach KitKat. Fügen Sie einfach den folgenden Code in die onCreate-Methode Ihrer Aktivität ein. Änderungen an der Manifest-Datei sind nicht erforderlich.
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);
}