戻るボタンのアクションバーへの付け方

端末標準の設定アプリでは各設定画面のアクションバーのタイトルが下の画像のように戻るボタンになっていて直前のアクティビティに戻ることができるようになっています。

タイトルに戻るボタンのついているアプリ

ここではこのようにアクションバーへの戻るボタンの取り付け方を紹介します。

ただし、この機能は本来はAndroid4.0以上で動くものです。そこでここではactionbarsherlockというFragmentActivityを継承したライブラリを使っています。

子アクティビティの作成

初めに親アクティビティから呼ばれ、戻るボタンを持つ子アクティビティを作ります。例えば次のように

package com.MyApp.myapp;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.support.v4.app.TaskStackBuilder;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.MenuItem;

/**MainActivityから起動するアクティビティ*/
public class ChildActivity extends SherlockFragmentActivity 
{	
    @Override
    protected void onCreate(Bundle savedInstaceState)
    {
        super.onCreate(savedInstaceState);
        
        setContentView(R.layout.child_activity);
        
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
            //戻るボタンを有効化
    }
    
    /**アクションバーの戻るボタンが押されたら直前のアクティビティ(呼び出し元)に返る。*/
    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch(item.getItemId()){
        case android.R.id.home:
            Intent upIntent = NavUtils.getParentActivityIntent(this);
            if(NavUtils.shouldUpRecreateTask(this, upIntent)){
                //もし自アプリ以外から起動したなら起動元のアプリを作り直す
                TaskStackBuilder.create(this)
                    .addNextIntentWithParentStack(upIntent)
                    .startActivities();
            }else{
                //自アプリに戻る
                NavUtils.navigateUpTo(this, upIntent);
            }
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

setDisplayHomeAsUpEnabledメソッドにtrueを渡せばタイトルが戻るボタンになります。

そして戻るボタンが押されたことを感知しているのがonOptionItemSelectedメソッドです。

戻るボタンが押された場合は特別にR.id.homeというIDを持つアイテムが渡されるのでそれを受け取ったら起動元のアプリ(自アプリ以外でもOK)に戻っています。

呼び出し元アクティビティ

次に子アクティビティを親アクティビティから起動します。

呼び出す場合は普通にIntentから起動するだけで特別なことはしません。

package com.MyApp.myapp;

import com.actionbarsherlock.app.SherlockFragmentActivity;

import android.os.Bundle;
import android.widget.Button;

public class MainActivity extends SherlockFragmentActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button openActivity1Button 
                = (Button) findViewById(R.id.openActivity1Button);
        openActivity1Button.setOnClickListener(new View.OnClickListener() 
        {
            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent(
                        MainActivity.this, ChildActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
                    //アクティビティ起動
            }
        });
    }
}

AndroidManifest.xmlの設定

最後にアクティビティが戻るボタンでどのアクティビティに戻るかという関係をマニフェストファイルのapplication要素以下で指定してあげます。

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name">
    <activity
        android:name="com.MyApp.myapp.MainActivity"
        android:label="@string/app_name">
    </activity>
        <!--親アクティビティ-->
    <activity
        android:name="com.MyApp.myapp.ChildActivity"
        android:label="@string/activity1"
        android:parentActivityName="com.MyApp.myapp.MainActivity">
        <meta-data 
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.MyApp.myapp.MainActivity"/>
            <!--Android4.0以下の端末対策-->
    </activity>
</application>

parentActivityName属性に起動元のアクティビティのパッケージ名を渡します。

またAndroid4.0以下の端末向けにmeta-tag要素に親アクティビティの情報も書いておきます。

関連項目
プライバシーポリシー