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


137

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

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);
    }
});

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


64
getActionBar().setDisplayHomeAsUpEnabled(true);onCreate内と switch (item.getItemId()) {case android.R.id.home: onBackPressed();break;}ではonOptionsItemSelected?ServicesViewActivityの両方
セルビン

7
回答の棚としてはどうですか?
KarlKarlsom

回答:


263

セルビンはすでに正しい答えを投稿しました。ここでは、かなりのコードでのソリューション:

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>

詳細については、こちらをご覧ください。


1
私の状況では、親に戻るときに親のonCreateを呼び出さない方法を探していました。これを行うために、私はあなたの実装を使用しましたが、NavUtils.navigateUpFromSameTask(this)の代わりにfinish()を呼び出しました。finish()は、私にとってより理想的なonCreateではなく、onStartを呼び出します。
Jon、

マニフェストにメタデータを設定することは、ナビゲーションボタンを機能させるための鍵です
VSB

getActionBar().setDisplayHomeAsUpEnabled(true);サポートライブラリを使用している場合に使用します。
Abhinav Upadhyay

「ワイプ」の方向をどのように変更しますか?デフォルトでは、この戻るナビゲーションを実装すると、画面が右から左にスイープし、新しい画面をロードしているように見えます。ただし、デバイス自体の戻るキーを押すのと同じように、左から右にワイプしたい。
stingray_

エラーが発生しました:原因:java.lang.NullPointerException:nullメソッド参照で仮想メソッド 'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)'を呼び出そうとしました
ジョーンズ

165

アクティビティで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);
    }
}

getSupportActionBar()。setDisplayHomeAsUpEnabled(true);を変更すると機能します。in getActionBar()。setDisplayHomeAsUpEnabled(true); =>:これらのonCreateメソッドの内部で@SuppressLint( "NewApi")とoutsideFor REF添加developer.android.com/training/implementing-navigation/...
gnganpath

1
@ganpath注意、getActionBarの使用はAPI 11以降用です。
Jared Burrows、

17

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

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

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

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

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

今、あなたは、メソッドを起動することができますNavUtils.navigateUpFromSameTask(this); しかし、あなたが指定しているいけない場合android:parentActivityName、あなたにはAndroidManifest.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()

どの道を進むかはあなた次第ですが、特にすべてのアクティビティに基本クラスを使用する場合は、解決策が役立つと思いました。


10

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);
}

それは仕事です:]


これが私にとって最も簡単な方法だと思います。ありがとう
TuanDPH



3

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

OnCreateメソッドに次を追加します。

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

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

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


1

ツールバーを使用している場合、私は同じ問題に直面していました。私はこれらの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);

0

次の手順は、ボタンを戻るのに十分です:

ステップ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

Jaredの答えに基づいて、いくつかのアクティビティでアクションバーの戻るボタンの動作を有効にして実装する必要があり、コードの重複を減らすためにこのヘルパークラスを作成しました。

public final class ActionBarHelper {
    public static void enableBackButton(AppCompatActivity context) {
        if(context == null) return;

        ActionBar actionBar = context.getSupportActionBar();
        if (actionBar == null) return;

        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

アクティビティでの使用:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...

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