Android прозрачная строка состояния и панель действий
Я сделал несколько исследований на эту тему, и я не мог найти полное решение, так что, шаг за шагом и с некоторыми проб и ошибок, я, наконец, выяснить, как мы можем достичь этих результатов: имея прозрачный или цветной Actionbar
и Statusbar
. Смотрите мой ответ ниже.
2 ответа:
я разрабатываю приложение, которое должно выглядеть одинаково на всех устройствах с >= API14, когда речь заходит о настройке actionbar и statusbar. Я наконец нашел решение, и так как это заняло немного моего времени, я поделюсь им, чтобы спасти некоторые из ваших. Начнем с использования зависимости appcompat-21.
прозрачный Верхней панели:
ценностей/стили.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>
значения-v21 / стили.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
прозрачно макет будет использовать свою высоту. Чтобы предотвратить это нам просто нужно к:РЕШЕНИЕ ПЕРВОЕ:
Добавьте эту строкуandroid:fitsSystemWindows="true"
в вашем контейнере макета все, что вы хотите разместить ниже панели действий:... <LinearLayout android:fitsSystemWindows="true" android:layout_width="match_parent" android:layout_height="match_parent"> ... </LinearLayout> ...
РЕШЕНИЕ ВТОРОЕ:
Добавьте несколько строк к нашему предыдущему методу: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
будет идентификатор представления контейнера макета того, что мы хотим разместить ниже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); }
Примечание:
abstract class
что расширяетActionBarActivity
Надеюсь, это поможет!
Он поддерживает после 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); }