Action Bar. Добавляем кнопку Home

| 15.08.2014

Кнопка Home в Action Bar-е позволяет вернуться на домашний/главный/предыдущий экран приложения или любой другой. На самом деле, вы вольны обрабатывать клик так, как вам захочется, и можете добавить целевое активити такое, какое будет уместно в данном контексте. По этой причине название Home несколько узко, однако оно подразумевает, что переход на главный/родительский/предыдущий экран — это все же удобнее и понятнее для навигации.

Кнопка Home обычно расположена слева в Action Bar-е и включает в себя угловую скобку < и название текущего Активити.

Action Bar. Добавляем кнопку Home

Создадим простое приложение с двумя экранами/Активити. В первом будет добавлена кнопка, по которой мы можем кликнуть и перейти на второй экран. Приложение будет создано для API >= 9 (будем использовать Support Library).

Добавим строковые ресурсы res/values/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">HomeButton</string>
    <string name="activity_with_home">Activity with Home Button</string>
    <string name="main_activity">Main Activity</string>
    <string name="change_activity">Change Activity</string>
    <string name="home_activity">Home Activity</string>

</resources>

LinearLayout для первого Активити — res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="top|center"
    tools:context=".MainActivity">

    <TextView
        android:text="@string/main_activity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/change_activity"
        android:id="@+id/button"
        android:onClick="changeActivity"
        />

</LinearLayout>

Не забудьте добавить для кнопки атрибут android:onClick, который будет отсылать обработку кликов на метод changeActivity().

Код MainActivity.java

package ru.androiddocs.homebutton;

import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;


public class MainActivity extends ActionBarActivity {

    Intent mIntent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void changeActivity(View v) {
        mIntent = new Intent(this, ActivityWithHome.class);
        startActivity(mIntent);
    }
}

Код простой. В onCreate() стандартные вещи. В методе changeActivity() мы создаем новый интент со вторым Активити и переходим на ActivityWithHome с помощью метода startActivity(), принимающим в качестве параметра созданный Intent.

Создадим layout для второго Активити — res/layout/activity_with_home.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="top|center">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/activity_with_home"
        android:id="@+id/textView" />
</LinearLayout>

Код второго Активити — ActivityWithHome.java

package ru.androiddocs.homebutton;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.view.MenuItem;

public class ActivityWithHome extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_with_home);

        ActionBar actionBar = getSupportActionBar();
        actionBar.setHomeButtonEnabled(true);
        actionBar.setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                startActivity(new Intent(this, MainActivity.class));
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

Как видите, мы добавляем кнопку Home в методе onCreate() программно. Сначала получаем доступ до ActionBar:

ActionBar actionBar = getSupportActionBar();

Для новых API можно использовать метод getActionBar(). Затем включаем кнопку — setHomeButtonEnabled(), передавая в качестве параметра true. Метод setDisplayHomeAsUpEnabled() включает/выключает отображение навигации и добавляет угловую скобку.

В методе onOptionsItemSelected() мы обрабатываем нажатие на кнопку Home — придет значение android.R.id.home. В этом блоке мы запускаем вновь наше главное Активити.

Не забудьте добавить в файл манифеста информацию о новом активити:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ru.androiddocs.homebutton" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/home_activity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ActivityWithHome"
            android:label="@string/activity_with_home">
        </activity>
    </application>
</manifest>

Action Bar. Добавляем кнопку Home

Action Bar. Добавляем кнопку Home

Также можно настроить «автоматическое» определение на какое «родительское» Активити мы должны перейти по нажатию кнопки Home. Например, если вы просматриваете список ListView, а затем переходите на просмотр отдельного пункта, то весь список в данном случае и будет родителем. Для этого в блоке case нужно поместить такой код (пример для нашего приложения):

case android.R.id.home:
    NavUtils.navigateUpFromSameTask(this);
    return true;

А в файле манифеста для второго Активити прописать атрибут с родительским Активити:

<activity
    android:name=".ActivityWithHome"
    android:parentActivityName=".MainActivity" >
    android:label="@string/activity_with_home">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity" />
</activity>

Атрибут здесь содержит описание для версий API <= 4.

Если вы запустите сейчас обновленный код, то получите тот же результат, что и при «ручном» создании Intent-объекта.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*