web-dev-qa-db-ja.com

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

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

89
Drew

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

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

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

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

enter image description here

次に、上記を実行した後、クリックイベントを利用するコードを作成する必要があります。そのためには、実際にアプリケーションアイコンをクリックすると、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);
125
Luke F.

このコードを使用

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

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

  int id = item.getItemId();

     if (id==Android.R.id.home) {
        finish();
    }
53
anupam sharma

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

@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;
}
35
Lucy Fair

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

16
spacebiker

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

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>

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

9
tot

まず、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);
    }
5
M Anees

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

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

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

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

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

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

5
luke8800gts

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

乾杯。

4
ralphgabb

最初にこのコードを書く必要があります

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

マニフェストにこの行を追加

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

うまくいくと思う

3
Shahriar Ahmad

アクティビティが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()で呼び出すだけで、電話の戻るボタンとツールバーの矢印が同じことを行います。

3
Ruzin

ここでも同じ動作をする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に入れます。

2
Mygod

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

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

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

1
RaQib

私のアプリにはいつでも行き来できる3つのアクティビティがあるため、正しい答えを得るためにいくつかの答えを混ぜる必要がありました。 Activity1> Activity2> Activity3。 activity3で何かをしていたとき、戻るボタンがActivity2に正しく戻っていました。ただし、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>

最後に、メニューのアクションボタン(アクションバー):

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
Gi Tavares

ActionBarを使用している場合は、このドキュメントを参照してください http://developer.Android.com/reference/Android/app/ActionBar.html#setDisplayHomeAsUpEnabled(boolean)

次に、onOptionsItemSelected(MenuItem)メソッドを上書きし、着信するAndroid.R.id.homeイベントを探す必要があります。ユーザーがアクションバーの戻るボタンをクリックしたことがわかります。

1
Paul Thompson
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
Abhay Agrawal

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

0
user3700215

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

0
aby4reality

他の回答では、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" />
0
Michael Litvin

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

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
ofri cofri

これは私のために働いています.. 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>

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

enter image description here

0

Kotlinの場合:

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        onBackPressed();
        return true;
    }
0
Raluca Lucaci