Android-タイトルバーの戻るボタン


110

多くのアプリ(カレンダー、ドライブ、Playストア)では、ボタンをタップして新しいアクティビティを入力すると、タイトルバーのアイコンが[戻る]ボタンに変わりますが、私が作成しているアプリの場合はそうではありません。そのアイコンを元の画面に戻すにはどうすればよいですか?


OnCreateの例でgetSupportActionBar()を試してくださいfreakyjolly.com/how-to-add-back-arrow-in-android-activity
Code Spy

回答:


145

タイトルバーに戻るボタンを作成するには、2つの簡単な手順があります。

まず、タイトルバーに戻るボタンを配置するアクティビティの次のコードを使用して、アプリケーションアイコンをクリック可能にします。

ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);

上記のコードを追加すると、アプリケーションアイコンの左側に戻る矢印が表示されます。

ここに画像の説明を入力してください

次に、上記を実行した後も、クリックイベントを利用するコードを作成する必要があります。そのためには、実際にアプリケーションアイコンをクリックすると、onOptionsItemSelectedメソッドが呼び出されることに注意してください。したがって、前のアクティビティに戻るには、そのメソッドをアクティビティに追加し、前のアクティビティにIntent戻るコードをそこに挿入します。たとえば、戻ろうとしているアクティビティがと呼ばれいるとしMyActivityます。戻るには、次のようにメソッドを記述します。

public boolean onOptionsItemSelected(MenuItem item){
    Intent myIntent = new Intent(getApplicationContext(), MyActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}

それでおしまい!

(Android開発者APIでは、マニフェストをいじって、のようなものを追加することをお勧めしますandroid:parentActivityName。しかし、それは私にはうまくいかないようです。上記の方が単純で信頼性が高いです。)

<meta-data
      android:name="android.support.PARENT_ACTIVITY"
      android:value=".MainActivity" />

そしてあなたの活動で

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

23
よく説明しましたが、onOptionItemSelectedに問題がない場合は、finish()を呼び出すだけです。あなたの場合、startActivityForResultは2番目のアクティビティを起動し、2番目のアクティビティから押し戻すと、最初のアクティビティに戻ります(ここで、アクションバーアイコンを押しました)
Yahya Arshad

8
さらに、item.getItemId()がandroid.R.id.homeである場合にのみ、それを行う必要があります
bitek

2
ASの状態として:「メソッド呼び出し 'actionBar.setDisplayHomeAsUpEnabled(true)'がjava.lang.NullPointerExceptionを生成する可能性があります」
statosdotcom

1
警告!ToolBarを使用すると、actionBarはnullを返します。以下の回答をご覧ください。
CoolMind 2017

5
getActionBar()が機能しませんでした。アプリがクラッシュしました。getSupportActionBar()は機能しました。
john ktejik 2018年

60

このコードを使用

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

その後、このコードをonOptionsItemSelectedメソッドに記述します

  int id = item.getItemId();

     if (id==android.R.id.home) {
        finish();
    }

1
getActionBar()nullを与えます。なぜなのかご存知ですか?
msysmilu 2015年

3
たとえば、<item name = "android:windowActionBar"> false </ item> <item name = "android:windowNoTitle"> true </ item>スタイルのActionBarがないため
Paul Verest

46

アクションバー/ツールバーに戻るボタンを適切に追加することができました

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

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

    return super.onOptionsItemSelected(item);
}

public boolean onCreateOptionsMenu(Menu menu) {
    return true;
}

3
これが私にとって有効な唯一の答えです。ありがとう@LucyFair
ArdaÇebi

2
同じ。お返事ありがとうございます。
マリア

同じ。他の答えはどれも機能しません。これは受け入れられるべき答えでした。
El Sushiboi

18

1.-アクティビティをAndroidManifest.xmlに追加し、メタデータを提供するようにしてください:

<activity
    android:name="com.example.myfirstapp.DisplayMessageActivity"
    android:label="@string/title_activity_display_message"
    android:parentActivityName="com.example.myfirstapp.MainActivity" >
    <!-- Parent activity meta-data to support 4.0 and lower -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.myfirstapp.MainActivity" />
</activity>

2.-次のコードをアクティビティのonCreateメソッドに追加します。

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

3.- onOptionsItemSelectedをオーバーライドし、NavUtils.navigateUpFromSameTask()静的メソッドを使用してナビゲートしてスタックをスローします。

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

ただし、navigateUpFromSameTask()の使用は、アプリが現在のタスクの所有者である場合(つまり、ユーザーがアプリからこのタスクを開始した場合)にのみ適しています。それが当てはまらず、アクティビティが別のアプリに属する​​タスクで開始された場合、上に移動すると、アプリに属する​​新しいタスクが作成されます。これには、新しいバックスタックを作成する必要があります。


NavUtilsをご紹介いただきありがとうございます。
AntonSack

10

アクティビティがアクティビティを拡張する場合

public class YourActivity extends Activity {

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

        getActionBar().setHomeButtonEnabled(true);

        [...]
    }

    [...]
}

アクションがAppCompatActivityを拡張する場合

public class YourActivity extends AppCompatActivity {

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

            getSupportActionBar().setHomeButtonEnabled(true);

            [...]
        }

        [...]
    }

もする必要はありません。「追加アクション参照してください

[オプション]親アクティビティを明示的に定義するには、次のようにManifest.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.YourActivity "
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

親アクティビティの指定を参照してください


1
これはまさに私が探していたものです。あなたは私の日を救った。どうもありがとう。
Tashi Dendup

6

アクティビティが拡張AppCompatActivityする場合は、次のようにonSupportNavigateUp()メソッドをオーバーライドする必要があります。

public class SecondActivity extends AppCompatActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_second);
       Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
       setSupportActionBar(toolbar);
       getSupportActionBar().setHomeButtonEnabled(true);
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
       ...
   }

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

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

onBackPressed()メソッドでロジックを処理し、そのメソッドを呼び出すだけonSupportNavigateUp()で、電話の戻るボタンとツールバーの矢印が同じようになります。


6

まず、onCreate関数で次の行を追加します

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

コードに次の関数を追加します。

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

        return super.onOptionsItemSelected(item);
    }

6

まず、このコードを書く必要があります

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

次に、この行をマニフェストに追加します

 <activity android:name=".MainActivity"
            android:parentActivityName=".PreviousActivity"></activity>

うまくいくと思います


5

Android Studioで5.1の新しいサポートライブラリを使用している場合は、代わりにこれをAppCompatActivityで使用できます

 ActionBar actionBar = getSupportActionBar();
 actionBar.setHomeButtonEnabled(true);
 actionBar.setDisplayHomeAsUpEnabled(true);
 actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp);
 actionBar.setDisplayShowHomeEnabled(true);

乾杯。


5

グーグルがここで説明する最も簡単な方法とベストプラクティス:

1. childActivityの親をに追加しますAndroidManifest.xml

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

2. childActivityの戻るボタンをアクティブにします。

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

私のために働いた、私もそれがあなたのために働くことを願っています。


これは、アクティビティが親アクティビティを1つしか持つことができない場合にのみ有効です。それが私の場合です。+1
MQoder 2017年

私の場合、ステップ2は必要ありませんでした。
Thomio

5

私が見つけた素晴らしい時間の後、テーマオプションが私のコードの主な問題であり、以下は私のためにツールバーを表示する適切な方法です

AndroidManifestファイルでは、最初にテーマスタイルを変更する必要があります

Theme.AppCompat.Light.DarkActionBar
to 
Theme.AppCompat.Light.NoActionBar

次に、あなたの活動xmlであなたはあなたのようなツールバーを呼び出す必要があります

<androidx.appcompat.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimary"
        android:id="@+id/toolbar"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        android:elevation="4dp"/>

そして、このツールバーはあなたのJavaファイルで

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

そして、ツールバーを表示する場合、UはNullPointerExceptionを回避するためにnullをチェックする必要があります。

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

自宅でのアクティビティには、これを追加してください

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

        return super.onOptionsItemSelected(item);
    }

またはご希望のアクティビティに戻る

public boolean onOptionsItemSelected(MenuItem item){
    Intent myIntent = new Intent(getApplicationContext(), YourActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}

3

たくさんの複合体の答えを見たので、これが私のコードです。ここで働いています。これは2つの方法で実現できます。

1)Stardard Android互換性

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.NavUtils;

import android.view.MenuItem;
import android.view.View;

public class EditDiscoveryActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_discovery);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        /*toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });*/
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

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

}

2)カスタムアイコンを使用する

コメントでコードを使用したい場合は、ic_arrow_white_24dp.xmlという名前のドローアブルにこのファイルを追加する必要があります。

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <path
        android:fillColor="#ffffff"
        android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
    </vector>

このコードで。

toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
            toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    finish();
                }
            });

それがここの人々を助けることを願っています!


2

ActionBarActivityそれを使用しない軽量バージョンでも、同じ動作がここにあります:

public class ToolbarConfigurer implements View.OnClickListener {
    private Activity activity;

    public ToolbarConfigurer(Activity activity, Toolbar toolbar, boolean displayHomeAsUpEnabled) {
        toolbar.setTitle((this.activity = activity).getTitle());
        if (!displayHomeAsUpEnabled) return;
        toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
        toolbar.setNavigationOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        NavUtils.navigateUpFromSameTask(activity);
    }
}

使用方法:置きnew ToolbarConfigurer(this, (Toolbar) findViewById(R.id.my_awesome_toolbar), true);onCreate


これは、サポートライブラリに含まれている新しいツールバーウィジェットに適合します。ありがとう!!
クロッカー2016年

2

下記のコードをマニフェストファイルに追加する必要があります。戻る矢印機能を追加するアクティビティを検索します。あなたがそれを見つけたら、それでいいか、アクティビティを作成してください

<activity android:name=".SearchActivity">

</activity>

次に、間に次の3行のコードを追加します。

<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.raqib.instadate.MainActivity" />

そして、onCreate();にこのコードを追加することを忘れないでください。戻る矢印が必要な特定のアクティビティのメソッド。

        Toolbar toolbar = (Toolbar) findViewById(R.id.searchToolbar);
    setSupportActionBar(toolbar);
    try{
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }catch(NullPointerException e){
       Log.e("SearchActivity Toolbar", "You have got a NULL POINTER EXCEPTION");
    }

これは私が問題を解決した方法です。ありがとう。


2

他の回答は、ToolbarウィジェットのXMLでこれを設定することもできることについては触れていません。

app:navigationIcon="?attr/homeAsUpIndicator"

例えば:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:navigationIcon="?attr/homeAsUpIndicator"
    app:popupTheme="@style/AppTheme.PopupOverlay"
    app:title="@string/title_activity_acoustic_progress" />

2

2020年に必要なこと:
(MainActivityに戻りたいと考えている場合)

protected void onCreate(Bundle savedInstanceState){
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

public boolean onOptionsItemSelected(MenuItem item) {
    Intent myIntent = new Intent(getApplicationContext(), MainActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}

それは興味深いですが、MainActivityに戻りたいと想定しています。以前のアクティビティにどのようにリダイレクトしますか?
Mayid

1

ActionBarを使用している場合は、このドキュメントを読む必要があります 。http://developer.android.com/reference/android/app/ActionBar.html#setDisplayHomeAsUpEnabled(boolean)

次に、メソッドonOptionsItemSelected(MenuItem)を上書きして、android.R.id.homeイベントが発生することを確認する必要があります。次に、ユーザーがアクションバーのその戻るボタンをクリックしたことを確認します


1

アプリマニフェストで親アクティビティを指定することにより、コードなしでも実行できます。アクティビティAに移動するアクティビティBの戻るボタンが必要な場合は、マニフェストでアクティビティBの親としてアクティビティAを追加するだけです。



1

私のアプリにはいつでも行き来できる3つのアクティビティがあるため、正しい答えを得るためにいくつかの答えを組み合わせる必要がありました。Activity1> Activity2> Activity3。アクティビティ3で何かをしているときに、戻るボタンがアクティビティ2に正しく戻っていました。ただし、Activity2からを使用するとfinish()、Activity1ではなくActivity3に戻っていました。そして、AppCompatActivityを拡張しています。だから、私の解決策は:

public class Activity2 extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...

            getSupportActionBar().setHomeButtonEnabled(true);
        }
    }

AndroidManifest.xmlの場合:

<activity android:name=".activities.Activity2"
           android:parentActivityName="com.example.appname.activities.Activity1">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.appname.activities.Activity1" />
        </activity>

そして最後に、私のメニューのアクションボタン(actionbar):

public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            ...

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

        }

        return super.onOptionsItemSelected(item);

    }

NavUtils.navigateUpFromSameTask(this);代わりにを使用すると、うまくいきましたfinish()


1

私を助け、他の人に役立つかもしれない何かを共有するだけです。ここでの答えのほとんどは正しいですが、を使用するとgetActionBar().setDisplayHomeAsUpEnabled(true);、これは私にとってはうまくいきませんでした。私が抱えていた問題は、2つ目のアクティビティを手動で作成しようとしていたことですが、詳細が含まれています。
私の問題を本当に解決したのは、Android開発者向けチュートリアル( Android Studio独自のツールを使用して2つ目のアクティビティを作成するための https://developer.android.com/training/basics/firstapp/starting-activity)でした:

Create the second activity
1. In the Project window, right-click the app folder and select New > Activity > Empty Activity.
2. In the Configure Activity window, enter "DisplayMessageActivity" for Activity Name and click Finish (leave all other properties set to the defaults).
Android Studio automatically does three things:
- Creates the DisplayMessageActivity file.
- Creates the corresponding activity_display_message.xml layout file.
- Adds the required <activity> element in AndroidManifest.xml.

0

また、単にonBackPressed()onClickリスナーに入れることもできます。これにより、ボタンはAndroidアプリのデフォルトの「戻る/上」ボタンのように機能します。


0
Toolbar toolbar=findViewById(R.id.toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

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

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

0

これは私のために働いています。2つのアクティビティ(Activityone、Activitytwo)があるとします。

Activitytwo内でこのコードを使用します

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

Activityone

//when you need to go second activity
startActivity(new Intent(Activityone.this, Activitytwo.class));

これはマニフェストファイル内の2番目のアクティビティに含める必要があります

<activity android:name=".Activitytwo"
        android:parentActivityName=".Activityone"></activity>

そして結果はこのようになります

ここに画像の説明を入力してください


0
  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.YourxmlFileName);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

  public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id==android.R.id.home) {
            finish();
            return true;
        }
        return false;
    }

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