Androidでアクションバーの戻るボタンをオーバーライドする方法は?


95

ハードキーの戻るボタンではなく、アクションバーのアクティビティの戻るボタンをカスタマイズしたい。onBackPressed()メソッドをオーバーライドしました。エミュレータの戻るボタンでは機能しますが、アクションバーの戻るボタンでは機能しません。

アクションバーで発生させたい。これどうやってするの?

これが私のコードです:

@Override
public void onBackPressed() {
    Toast.makeText(getApplicationContext(),"Back button clicked", Toast.LENGTH_SHORT).show(); 
    return;
}

私はこのトーストをバックプレスが機能しているかどうかに関係なく使用しましたが、実際の実装は前のアクティビティに戻るように変更されます。ただし、これは(アクティビティのタイトルのほかに)アクションバーの上にあるボタンでは機能しません。

誰でも私に問題を明記してください。

回答:


209

ホームボタンのクリック操作をオーバーライドしたいと思います。このような機能は、アクティビティでオーバーライドできます。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        Toast.makeText(getApplicationContext(),"Back button clicked", Toast.LENGTH_SHORT).show(); 
        break;
    }
    return true;
}

1
ノア・イブラヒム、実はブラウザの戻るボタンのように左上に戻るボタンがあります。そのボタンをクリックすると、前のアクティビティに戻りたいです。上記のコードuとは異なります。
GK

4
super.onBackPressed();を追加します それへ
redestructa 2013

2
に変更return true;した後、これは私のために働いたreturn super.onOptionsItemSelected(item)。次に、ユーザーがアクションバーの戻るボタンをクリックしたときに何かが発生するようにできますが、ボタンの同じ機能は保持されます。
熊平山

この手法では、戻る矢印ボタンの応答が遅くなります。つまり、イベントが発生するまで1秒待つ必要があります。また、このボタンを押している間、エフェクトのセレクターが表示されません
Gopal Singh Sirvi

私のために働いていませんでした。デバッグしたところ、ホームボタンのIDとクリックされたボタンのIDが異なることがわかりました。
viper

45

ActionBarの戻るボタンがハードウェアの戻るボタンと同じように動作するようにしたい場合:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
            if (item.getItemId() == android.R.id.home) {
                    onBackPressed();
                    return true;
            }
            return false;
    }

1
事件android.R.id.homeは発火しない
トランサー

2
@Trancerをフラグメントで使用する場合はsetHasOptionsMenu(true)、フラグメントのonCreateメソッドを追加で呼び出す必要があります
wilddev

10

ユーザーが戻るボタンを押すか、アクションバーのホームボタンを押すことができることに注意してください。
したがって、彼を同じ宛先にリダイレクトしたい場合は、これを行うことができます。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
    }
    return false;
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
    startActivity(intent);
    finish();
}

これにより、ユーザーはキーまたはアクションバーボタンを押す意図に移動します。


事件android.R.id.homeは発砲しません
トランサー

@Trancer、それはほぼ1.5年以上になります。そして、私は今アンドロイドをしません。今はお役に立てません。ごめんなさい。
ssi-anik 2017

だから解決策は何ですか?
GA1 2017年

7
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case android.R.id.home:
                       finish();
                   break;
                }
                return true;
        }

2
コメントとして追加することもできます。それは多かれ少なかれ、受け入れられた答えと同じです。
スーフィアン2014年

7

申し訳ありませんが私は遅い答えですが、同じ質問でこのページにアクセスする他の人のために、私は上記を試しました:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
  ...
  if (item.getItemId() == android.R.id.home) {
    ....
  }
  ....
}

しかし、これは「戻る」ボタンの押下をキャッチできませんでした。

最終的に、https: //stackoverflow.com/a/37185334/3697478で「AppCompatActivity」サポートライブラリのアクションバーを使用しているときに「onSupportNavigateUp()」をオーバーライドする方法が見つかりました。(新しいactionbar / toolbarライブラリには、同等の "onNavigateUp()"があります。)

@Override
public boolean onSupportNavigateUp(){  
  finish();  
  return true;  
}

そして、マニフェストファイルから「android:parentActivityName = "。MainActivity」セクションを削除しました。


4

私はこれを、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);
 }

2

再作成せずにActionBarホームボタンを押してアクティビティの前のインスタンスに戻る場合は、 getParentActivityIntentメソッドをオーバーライドして、バックスタックのインスタンスを使用できます。

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public Intent getParentActivityIntent() {
      return super.getParentActivityIntent().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
}

編集:
また、親アクティビティのlaunchModeをsingleTop
設定することで、同じ結果を得ることができますマニフェストで親アクティビティに 設定してください。 または、フラグFLAG_ACTIVITY_CLEAR_TOPをUPインテントで使用できます。 参照:アップナビゲーションの提供
android:launchMode="singleTop"


2

(1)子アクティビティに親アクティビティを追加します(AndroidManifest.xml)

<activity
        android:name=".ParentActivity" />

(2)子アクティビティ内のonSupportNavigateUpメソッドをオーバーライドします

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return false;
}

0
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == android.R.id.home) {
        onBackPressed();
        return true;
    }
    //noinspection SimplifiableIfStatement
    if (id == R.id.signIn) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
///////////////////
@Override
public void onBackPressed() {
    super.onBackPressed();
    finish();
}

0

バーに戻るボタンを設定する方法はいくつかあります。

1)メソッド.setDisplayHomeAsUpEnabled(true);はそれを行い、その後、単にオーバーライドできますandroid.R.id.home

2)<meta-data android:name="android.support.PARENT_ACTIVITY" android:value="my.package.parrent" />Androidマニフェストで追加しますが、この場合、OnOptionsMenuSelectedでオーバーライドできませんandroid.R.id.home

..なぜうまくいかないのか不思議に思う人のために...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.