Ich entwickle eine App, die auf allen Geräten mit> = API14 ähnlich aussehen muss, wenn es um die Anpassung von Aktionsleisten und Statusleisten geht. Ich habe endlich eine Lösung gefunden und da es etwas Zeit in Anspruch genommen hat, werde ich sie teilen, 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 verwenden, AndroidManifest.xml
um anzugeben, 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: Actionbar
Um die Statusbar
Transparenz zu erhalten, müssen Sie in API> = 21 auch die Transparenz erhalten . Andernfalls werden Ihre Farbstile nicht berücksichtigt und bleiben hellgrau.
Transparente Statusleiste (funktioniert nur mit API> = 19) :
Diese ist ziemlich einfach. Verwenden Sie 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 Sie werden ein funky Ergebnis bemerken:
Dies geschieht, weil Statusbar
das Layout bei Transparenz seine Höhe verwendet. Um dies zu verhindern, müssen wir nur:
LÖSUNG 1:
Fügen Sie diese Zeile android:fitsSystemWindows="true"
in Ihren Container für die Layoutansicht ein, und zwar unter der Aktionsleiste:
...
<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
wird die ID der Layout-Container-Ansicht von allem sein, was wir unter dem platzieren möchten Actionbar
:
...
<LinearLayout
android:id="@+id/bellow_actionbar"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
</LinearLayout>
...
Das ist es also, ich glaube, ich vergesse etwas nicht. In diesem Beispiel habe ich kein verwendet, Toolbar
aber ich denke, es wird das gleiche Ergebnis haben. So passe ich meine an 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);
}
Hinweis: Dies ist eine abstract class
Erweiterung der ActionBarActivity
Hoffnung, dass es hilft!