web-dev-qa-db-ja.com

Android ActionBarの戻るボタンを実装する方法は?

リストビューを使用したアクティビティがあります。ユーザーがアイテムをクリックすると、アイテム「ビューア」が開きます。

List1.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {

        Intent nextScreen = new Intent(context,ServicesViewActivity.class);
        String[] Service = (String[])List1.getItemAtPosition(arg2);

        //Sending data to another Activity
        nextScreen.putExtra("data", datainfo);
        startActivityForResult(nextScreen,0);
        overridePendingTransition(R.anim.right_enter, R.anim.left_exit);
    }
});

これは正常に機能しますが、アクションバーでは、アプリアイコンの横にある戻る矢印がアクティブになりません。何か不足していますか?

117
Joaolvcm

セルビンはすでに正しい答えを投稿しました、ここにきれいなコードの解決策があります;-)

public class ServicesViewActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // etc...
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case Android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

関数NavUtils.navigateUpFromSameTask(this)では、AndroidManifest.xmlファイルで親アクティビティを定義する必要があります

    <activity Android:name="com.example.ServicesViewActivity" >
            <meta-data
            Android:name="Android.support.PARENT_ACTIVITY"
            Android:value="com.example.ParentActivity" />
    </activity>

http://developer.Android.com/design/patterns/navigation.html#up-vs-back

241
surffan

アクティビティでActionBarホームボタンが有効になっていることを確認します。

Android、API 5+:

@Override
public void onBackPressed() {
     ...
     super.onBackPressed();
}

ActionBarSherlockおよびApp-Compat、API 7以降:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

Android、API 11以降:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

MainActivityを拡張する例ActionBarActivity

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case Android.R.id.home: 
            // API 5+ solution
            onBackPressed();
            return true;

        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

これにより、必要なすべてのアクティビティにバックプレスを設定できます。

Android、API 16+:

http://developer.Android.com/training/implementing-navigation/ancestral.html

AndroidManifest.xml

<application ... >
    ...
    <!-- The main/home activity (it has no parent activity) -->
    <activity
        Android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        Android:name="com.example.myfirstapp.DisplayMessageActivity"
        Android:label="@string/title_activity_display_message"
        Android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- The meta-data element is needed for versions lower than 4.1 -->
        <meta-data
            Android:name="Android.support.PARENT_ACTIVITY"
            Android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

MainActivityを拡張する例ActionBarActivity

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case Android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
150
Jared Burrows

ActionBarの戻るボタンを有効にするには、明らかにアクティビティにActionBarが必要です。これは、使用しているテーマによって設定されます。 AndroidManfiest.xmlでアクティビティのテーマを設定できます。 @Android:style/Theme.NoTitleBarテーマなどを使用している場合、ActionBarはありません。この場合、getActionBar()の呼び出しはnullを返します。そのため、最初にActionBarがあることを確認してください。

次のステップは、戻るボタンを押したときにナビゲートするアクティビティにAndroid:parentActivityNameを設定することです。これもAndroidManfiest.xmlで行う必要があります。

これで、「子」アクティビティのonCreateメソッドで戻るボタンを有効にできます。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

次に、戻るボタンのロジックを実装する必要があります。 「子」アクティビティでonOptionsItemSelectedメソッドをオーバーライドし、戻るボタンのIDがAndroid.R.id.homeであることを確認します。

メソッドNavUtils.navigateUpFromSameTask(this);を起動できるようになりましたBUTAndroid:parentActivityNameAndroidManfiest.xmlに指定していない場合、アプリがクラッシュします。

「何か」を忘れたことを思い出させるので、これはあなたが望むものであることがありますが、これを防ぎたい場合は、getParentActivityIntent()メソッドを使用してアクティビティに親があるかどうかを確認できます。これがnullを返す場合、親を指定してはいけません。

この場合、ユーザーがデバイスの戻るボタンを押すのと基本的に同じことを行うonBackPressed()メソッドを起動できます。アプリをクラッシュさせない優れた実装は

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case Android.R.id.home:
            if (getParentActivityIntent() == null) {
                Log.i(TAG, "You have forgotten to specify the parentActivityName in the AndroidManifest!");
                onBackPressed();
            } else {
                NavUtils.navigateUpFromSameTask(this);
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

NavUtils.navigateUpFromSameTask(this);onBackPressed()では、ユーザーに表示されるアニメーションが異なることに注意してください。

あなたが取る道はあなた次第ですが、特にすべての活動に基本クラスを使用している場合、私は解決策が役立つと思いました。

13
dknaack

AndroidManifestファイル:

    <activity Android:name=".activity.DetailsActivity">
        <meta-data
            Android:name="Android.support.PARENT_ACTIVITY"
            Android:value="br.com.halyson.materialdesign.activity.HomeActivity" />
    </activity>

detailsActivityに追加します。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);   
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

それは仕事です:]

8

Androidアノテーション:

@OptionsItem(Android.R.id.home)
void homeSelected() {
    onBackPressed();
}

ソース: https://github.com/excilys/androidannotations

7
ldd

onSupportNavigateUp()が最も簡単で最良の方法だと思います

このリンクのコードを確認してください 完全なコードについてはここをクリック

4

https://stackoverflow.com/a/46903870/4489222

これを達成するために、2つのステップがあります。

ステップ1:AndroidManifest.xmlに移動し、タグにパラメーターを追加します-Android:parentActivityName = "。home.HomeActivity"

例:

 <activity
    Android:name=".home.ActivityDetail"
    Android:parentActivityName=".home.HomeActivity"
    Android:screenOrientation="portrait" />

ステップ2:ActivityDetailで、前のページ/アクティビティのアクションを追加します

例:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
   switch (item.getItemId()) {
      case Android.R.id.home: 
          onBackPressed();
          return true;
   }
   return super.onOptionsItemSelected(item);}
}
3
Vivek Hande

ツールバーを使用している場合、同じ問題に直面していました。私はこれらの2つのステップに従って解決しました

  1. AndroidManifest.xmlで
<activity Android:name=".activity.SecondActivity" Android:parentActivityName=".activity.MainActivity"/>
  1. SecondActivityで、これらを追加します...
Toolbar toolbar = findViewById(R.id.second_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
1
user2823506

OnCreateメソッドでこれを追加します。

if (getSupportActionBar() != null)
    {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

次に、このメソッドを追加します。

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
1
Marco Concas
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

新しいAPIのonCreatedメソッド。

1
Kartik Garasia

次の手順で戻るボタンを使用できます。

ステップ1:このコードはManifest.xmlにある必要があります

<activity Android:name=".activity.ChildActivity"
        Android:parentActivityName=".activity.ParentActivity"
        Android:screenOrientation="portrait">
        <meta-data
            Android:name="Android.support.PARENT_ACTIVITY"
            Android:value=".activity.ParentActivity" /></activity>

ステップ2:あなたは与えません

finish();

子アクティビティを開始しながら、親アクティビティで。

ステップ3:子アクティビティから親アクティビティに戻る必要がある場合は、子アクティビティにこのコードを指定します。

startActivity(new Intent(ParentActivity.this, ChildActivity.class));
0
Kumar VL