В Android 4.0 (точніше в Android 3.0) з'явилася нова панель навігації. Розглянемо кілька прикладів взаємодії з цією панеллю.
Слід звернути увагу на наступні речі. Перше - поведінка панелі навігації на планшетах під управлінням Android 3.0 трохи відрізняється від панелі навігації для пристроїв під управлінням Android 4.0 і наведений код може не працювати. Другий момент - багато брендових телефонів мають власну прошивку, в якій не передбачена панель навігації. Враховуйте ці факти при розробці своїх програм.
Ховаємо системні кнопки навігації
Щоб приховати системну панель інструментів з кнопками Home, Back, можна використовувати код:
getWindow().
getDecorView().
setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
Цей спосіб підійде для ігор, читалок та інших додатків, де системна панель займає зайвий простір. Панель не видаляється, а просто зникає. Коли користувач натисне на екран у тій позиції, де знаходиться дана панель, то вона автоматично з'явиться.
Ховаємо або затемнюємо панель навігації
Способів керування панеллю навігації не так вже й багато. Точніше їх всього три. Ми можемо приховати панель або затемнити (рекомендується використовувати в іграх, щоб не відволікала). Управляється поведінка панелі за допомогою методу setSystemUiVisibility(), який можна застосувати до елементів View. Наприклад, ми можемо запустити додаток з прихованою панеллю, але як тільки ми торкнемося екрану (додаток отримає фокус), то панель відразу з'явиться. Для ефекту затемнення ми приготуємо кнопку. Третій спосіб показу панелі використовувати не будемо, так як вона і так з'являється без явного виклику методу.
Для початку створимо розмітку додатку з великою картинкою. Напевно, зручно було б, якщо при запуску панель навігації не виводилася відразу, щоб можна було розглянути картинку трохи краще.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="Button" />
<HorizontalScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<ScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/myimageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="center"
android:src="@drawable/twocats" />
</ScrollView>
</HorizontalScrollView>
</LinearLayout>
Тепер сам код:
public class NavBarAppActivity extends Activity {
ImageView myImageView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R. layout.main);
myImageView = (ImageView) findViewById(R. id.myimageview);
// ховаємо панель навігації при запуску
myImageView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}
public void onClick(View v) {
// затемнюємо панель навігації
myImageView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
} }
В результаті, при запуску панель буде приховано, при натисканні на екран з'явиться панель, а при натисканні на кнопку панель стане менш помітною.
Якщо говорити про затемнення, то приглушається не тільки панель навігації, але і рядок стану над заголовком, щоб посилити фокус на самому додатку. Перепишемо код для включення/вимикання ефекту.
public void onClick(View v) {
int currentVis = v.getSystemUiVisibility();
int newVis;
if ((currentVis & View.SYSTEM_UI_FLAG_LOW_PROFILE) == View.SYSTEM_UI_FLAG_LOW_PROFILE) {
newVis = View.SYSTEM_UI_FLAG_VISIBLE;
} else {
newVis = View.SYSTEM_UI_FLAG_LOW_PROFILE;
}
v.setSystemUiVisibility(newVis);
}
Спочатку ми дізнаємося поточні налаштування за допомогою методу getSystemUiVisibility(), а потім встановлюємо нові налаштування.
До речі, ви помітили, що на картинці два кота?
При затемненні і приховуванні ми використовували елемент ImageView в якості компонента, який управляє прапорами видимості. Зараз в офіційній документації використовується інший приклад, коли використовується об'єкт View, що отримується через метод getWindow().getDecorView(), хоча у коментарях сказано, що можна використовувати і старий спосіб. Зараз ми розглянемо цей приклад, заодно покажемо, як скинути всі прапори. Для прикладу достатньо двох кнопок.
public class MainActivity extends Activity {
View decorView;
int uiOptions = View.SYSTEM_UI_FLAG_LOW_PROFILE;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R. layout.activity_main);
decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(uiOptions);
}
// Клацання першої кнопки
public void onClick(View v) {
decorView.setSystemUiVisibility(uiOptions);
}
// Клацання другої кнопки
public void onClick2(View v){
// виклик setSystemUiVisibility() із значенням 0
// очистить всі прапори
decorView.setSystemUiVisibility(0);
} }
При натисканні першої кнопки панель інструментів і рядок стану затемнятся, а при натисненні на іншу кнопку знову з'являться.
Ховаємо рядок стану
Відштовхуючись від останнього прикладу, розглянемо випадок, коли ми хочемо приховати рядок стану, щоб отримати додаток на весь екран. Для цього нам потрібно використовувати прапор SYSTEM_UI_FLAG_FULLSCREEN. Такий спосіб рекомендується використовувати на Android 4.1 і вище. Приклад для старих версій описувати не буду, шукайте в документації.
public void onClick(View v) {
// на весь екран
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
}
Після натискання на кнопку, верхня смужка зникне і заголовок додатка зрушиться вгору.
Якщо хочете приховати заголовок додатка, то додайте ще два рядки коду:
// При необхідності можете приховати заголовок програми
ActionBar actionBar = getActionBar();
actionBar.hide();
Можна об'єднувати прапори, наприклад, можемо приховати панель інструментів і рядок стану одночасно:
public void onClick(View v) {
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN;
// ховаємо панель інструментів і рядок стану
decorView.setSystemUiVisibility(uiOptions);
}
Слід пам'ятати, що будь-яке натиснення в області екрана змусить з'явитися панель інструментів і рядок стану знову. Також майте на увазі, що коли користувач натисне на кнопку HOME, а потім повернеться в ваш додаток, панель інструментів і рядок стану будуть видимі, якщо ви розташували метод приховування в методі onCreate(), який просто не спрацює при поверненні. Тому використовуйте методи onResume() або onWindowFocusChanged().
Перекрити розмітку
За замовчуванням Панель дій розміщується у верхній частині активності, а сама розмітка активності знаходиться під панеллю. Можна змінити цю поведінку, коли панель буде накладатися на розмітку:
// onCreate()
getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R. layout.activity_main);