Отобразить кнопку возврата на панели действий


181

Я пытаюсь отобразить Back buttonна, Action barчтобы переместить предыдущую страницу / деятельность или на главную страницу (первое открытие). И я не могу этого сделать.

мой код

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

код находится в onCreate.


19
Использование: getSupportActionBar (). SetDisplayHomeAsUpEnabled (true);
Сукита Удугамасоория

@SukithaUdugamasooriya Большое спасибо
Сардорбек Рх

Ответы:


207

ну это просто, чтобы показать кнопку назад

actionBar.setDisplayHomeAsUpEnabled(true);

а затем вы можете настроить событие назад в onOptionsItemSelected

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

я добавил вышеупомянутые строки в onOptionsItemSelected (элемент MenuItem), так как у меня уже есть меню для плохого действия, я перечисляю идентификаторы для перенаправления пунктов меню, идентификатор home не работает при нажатии

Если вы испытываете странное поведение (например: вы используете кнопку «Назад» (R.id.home) фрагмента и заканчиваете тем, что закрываете действие), убедитесь, что у вас НЕ установлено «android: noHistory» для этого действия, потому что если если вы вернетесь от фрагмента к «обзору» действия, вы закончите его.
Игорь

2
Убедитесь, что вы установили родительскую активность в AndroidMenifest.xml, чтобы кнопка R.id.home работала.
Прыжок Ястреб

192

Я думаю, что onSupportNavigateUp()это лучший и самый простой способ сделать это, проверьте следующие шаги. Шаг 1 необходим, шаг второй имеет альтернативу.

Шаг 1, показывающий кнопку «Назад». Добавьте эту строку в onCreate()метод, чтобы отобразить кнопку «Назад».

assert getSupportActionBar() != null;   //null check
getSupportActionBar().setDisplayHomeAsUpEnabled(true);   //show back button

Шаг 2 Реализация обратного щелчка: переопределить этот метод

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

Это все, что вы сделали
ИЛИ Шаг 2 Альтернатива: Вы можете добавить мета к действию в файле манифеста как

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

Редактировать: если вы не используете AppCompatактивность, то не используйте supportслово, вы можете использовать

getActionBar().setDisplayHomeAsUpEnabled(true); // In `OnCreate();`

// And override this method
@Override 
public boolean onNavigateUp(){ 
     finish(); 
     return true; 
}

Спасибо @atariguy за комментарий.


2
Это решение прекрасно работает, когда вам нужно отправить данные обратно в родительское действие или если вы хотите сохранить значения EditText в родительском действии. Я пробовал onOptionsItemSelectedрешения, но не смог сделать это.
weeix

3
Лучшее решение +10.
Satheeshwaran

3
Если вы не используете библиотеку поддержки для панели действий, измените ее следующим образом: getActionBar().setDisplayHomeAsUpEnabled(true); @Override public boolean onNavigateUp(){ finish(); return true; }
atariguy

1
Феноменальный. +1. Просто. Элегантный. Прекрасный. :)
Рохит Кумар

1
Спасибо за вашу помощь. Используя manifest, он не работал, но использовал код, который работает
santosh devnath

70

Волшебство происходит в onOptionsItemSelected.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            // app icon in action bar clicked; go home
            Intent intent = new Intent(this, HomeActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

1
В моем случае я хочу добавить кнопку "Назад" на той странице, где не будет события onOptionsItemSelected (элемент MenuItem) ... Есть ли другое решение для этого ??
Видхи

1
Вы должны getActionBar().setDisplayHomeAsUpEnabled(true);сначала добавить в свой метод onCreateMethod кнопку show back
aletede91

1
Я думаю, что если вы поступите таким образом, вы не вернетесь назад, даже если вы снова начнете предыдущую деятельность, имея теперь еще одно ее начало, и будете всегда идти вперед и назад, пока не произойдет переполнение стека, если вы продолжите достаточно долго. Я думаю, что ответ Игоря правильный, вы должны остановить это действие с помощью finish () и позволить фреймворку вернуть вас к выполнению предыдущего экземпляра действия.
Рейо Корхонен

2
Используйте this.onBackPressed();метод, когда пользователь нажимает кнопку «Назад».
CaptRisky

47

Официальное решение

Добавьте эти два фрагмента кода в свой SubActivity

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getActionBar().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);
}

добавить метаданные и parentActivity в манифест для поддержки более низкого SDK.

 <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.SubActivity"
        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>

Ссылка здесь: http://developer.android.com/training/implementing-navigation/ancestral.html


5
Примечание: если вы используете библиотеки поддержки для обратной совместимости, вам нужно будет использовать «getSupportActionBar ()» вместо «getActionBar ()». Это самый полный и официальный ответ.
Кристофер Булл

32

Добавьте эти строки в onCreate ()

android.support.v7.app.ActionBar actionBar = getSupportActionBar();
   actionBar.setHomeButtonEnabled(true);
   actionBar.setDisplayHomeAsUpEnabled(true);

и в onOptionItemSelected

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                //Write your logic here
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

Надеюсь, что это поможет вам..!


27

Попробуйте этот код, считает, только если вам нужна кнопка назад.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //YOUR CODE
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    //YOUR CODE
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}

17

По вашему onCreateметоду добавьте:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

При определении в AndroidManifest.xmlродительском действии (действие, которое будет вызываться после нажатия кнопки «Назад» на панели действий):

В вашем <activity>определении в Манифесте добавьте строку:

android:parentActivityName="com.example.activities.MyParentActivity"

Вам нужно только ввести код Manifest, если вы хотите поддерживать устройства до версии 4.0. Первый фрагмент кода - лучшее решение для текущих библиотек.
Луи Бертончин

8

Я знаю, что немного опоздал, но смог решить эту проблему, следуя непосредственно документации .

Добавьте метаданные тега AndroidManifest.xml(чтобы система знала)

 <activity
        android:name=".Sub"
        android:label="Sub-Activity"
        android:parentActivityName=".MainChooser"
        android:theme="@style/AppTheme.NoActionBar">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainChooser" />
    </activity>

Затем включите кнопку возврата (вверх) в вашем MainActivity

    @Override 
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_child);
 
    // my_child_toolbar is defined in the layout file 
    Toolbar myChildToolbar =
        (Toolbar) findViewById(R.id.my_child_toolbar);
    setSupportActionBar(myChildToolbar);
 
    // Get a support ActionBar corresponding to this toolbar 
    ActionBar ab = getSupportActionBar();
 
    // Enable the Up button 
    ab.setDisplayHomeAsUpEnabled(true);
    } 

И все будет готово!

Источник: Документация для разработчиков Android


6

Я знаю, что выше есть много полезных решений, но на этот раз я прочитал эту статью (текущая версия Android Studio 2.1.2 с sdk 23), некоторые методы выше не работают.

Ниже мое решение для вспомогательной деятельности является MapsActivity

Во-первых, вам нужно добавить parentActivity в

AndroidManifest.xml

как это :

<application ... >
    ...
    <!-- Main activity (which has no parent activity) -->
    <activity
        android:name="com.example.myapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        .....
        android:parentActivityName=".MainActivity" >
        <!-- Support Parent activity for Android 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myapp.MainActivity" />
    </activity>
</application>

Во-вторых, убедитесь, что ваша дочерняя активность расширяется AppCompatActivity, а не FragmentActivity.

В-третьих, переопределить onOptionsItemSelected()метод

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                // app icon action bar is clicked; go to parent activity
                this.finish();
                return true;
            case R.id.action_settings:
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

Надеюсь, это поможет!


4

Попробуйте это, в вашем onCreate ()

 getActionBar().setHomeButtonEnabled(true);
 getActionBar().setDisplayHomeAsUpEnabled(true);

И для clickkevent,

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                // app icon in action bar clicked; goto parent activity.
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

4

Чтобы достичь этого, есть просто два шага,

Шаг 1: Перейти AndroidManifest.xmlи добавить этот параметр в <activity>тег -android:parentActivityName=".home.HomeActivity"

Пример:

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

Шаг 2: ActivityDetailдобавьте свою actionпредыдущую страницу / активность

Пример:

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

4

в методе onCreate write-

Toolbar toolbar = findViewById(R.id.tool);
    setSupportActionBar(toolbar);
    if (getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
}
@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
@Override
public void onBackPressed() {
    super.onBackPressed();
    startActivity(new Intent(ActivityOne.this, ActivityTwo.class));
    finish();
}

и это XML-файл

<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark"
android:id="@+id/tool">

и в styles.xml измените его на

Theme.AppCompat.Light.NoActionBar

это все, что мы должны сделать.


4

Это просто и работает для меня очень хорошо

добавить это внутри метода onCreate ()

getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

добавить это вне метода oncreate ()

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}

3

В вашем onCreate()методе добавьте эту строку

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

и, в том же Activity, добавьте этот метод для обработки нажатия кнопки

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

2

Я решил таким образом

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

@Override
public void onBackPressed(){
    Intent backMainTest = new Intent(this,MainTest.class);
    startActivity(backMainTest);
    finish();
}

1

мой рабочий код, чтобы вернуться на экран.

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

    case android.R.id.home:

        Toast.makeText(getApplicationContext(), "Home Clicked",
                Toast.LENGTH_LONG).show();

        // go to previous activity
        onBackPressed();

        return true;

    }

    return super.onOptionsItemSelected(item);
}

1
 public void initToolbar(){
       //this set back button 
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
       //this is set custom image to back button
       getSupportActionBar().setHomeAsUpIndicator(R.drawable.back_btn_image);
}


//this method call when you press back button
@Override
public boolean onSupportNavigateUp(){
    finish();
    return true;
}

1
ActionBar actionBar=getActionBar();

actionBar.setDisplayHomeAsUpEnabled(true);

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

    return super.onOptionsItemSelected(item);
}

1

Может быть слишком поздно, чтобы ответить, но у меня есть более короткое и более функциональное решение, по моему мнению.

// Inside your onCreate method, add these.
ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);

// After the method's closing bracket, add the following method exactly as it is and voiulla, a fully functional back arrow appears at the action bar
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}

1

Increate (); напишите эту строку->

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

затем реализовать метод ниже в этом классе

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
    case android.R.id.home:
        // app icon in action bar clicked; go home
      onBackPressed();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

1

manifest.xml

<activity
            android:name=".Activity.SecondActivity"
            android:label="Second Activity"
            android:parentActivityName=".Activity.MainActivity"
            android:screenOrientation="portrait"></activity>

1

Чтобы отобразить кнопку возврата панели действий в Котлине, есть 2 способа ее реализации.

1. используя панель действий по умолчанию, предоставляемую Android - ваша деятельность должна использовать тему с панелью действий - например: Theme.AppCompat.Light.DarkActionBar

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val actionBar = supportActionBar
    actionBar!!.title = "your title"
    actionBar.setDisplayHomeAsUpEnabled(true)
    //actionBar.setDisplayHomeAsUpEnabled(true)
}

override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}

2. Создайте свою собственную панель действий - отключите панель действий по умолчанию, например: Theme.AppCompat.Light.NoActionBar - добавьте макет в файл activity.xml

    <androidx.appcompat.widget.Toolbar
     android:id="@+id/main_toolbar"
     android:layout_width="match_parent"
     app:layout_constraintEnd_toEndOf="parent"
     app:layout_constraintStart_toStartOf="parent"
     app:layout_constraintTop_toTopOf="parent">

     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         tools:layout_editor_absoluteX="16dp">

         <TextView
             android:id="@+id/main_toolbar_title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="Your Title"
             android:textSize="25sp"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="0.5"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent" />

     </androidx.constraintlayout.widget.ConstraintLayout>
 </androidx.appcompat.widget.Toolbar>
  • OnCreate
override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)

     setSupportActionBar(findViewById(R.id.main_toolbar))
 }
  • создать свою собственную кнопку
<?xml version="1.0" encoding="utf-8"?>
<menu
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto" >

 <item
     android:id="@+id/main_action_toolbar"
     android:icon="@drawable/ic_main_toolbar_item"
     android:title="find"
     android:layout_width="80dp"
     android:layout_height="35dp"
     app:actionLayout="@layout/toolbar_item"
     app:showAsAction="always"/>

</menu>
  • в YourActivity.kt
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
     menuInflater.inflate(R.menu.main_toolbar_item, menu)

     leftToolbarItems = menu!!.findItem(R.id.main_action_toolbar)
     val actionView = leftToolbarItems.actionView
     val badgeTextView = actionView.findViewById<TextView>(R.id.main_action_toolbar_badge)
     badgeTextView.visibility = View.GONE

     actionView.setOnClickListener {
         println("click on tool bar")
     }
     return super.onCreateOptionsMenu(menu)
 }

0

Добавьте приведенный ниже код в функцию onCreate:

getSupportActionBar () setDisplayHomeAsUpEnabled (истина).

И затем переопределите: @Override public boolean onOptionsItemSelected (ItemItem item) {onBackPressed (); вернуть истину; }


0

В обновленной версии getActionBar () не работает!

Вместо этого вы можете сделать это таким образом

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
    }

добавить кнопку назад в строке заголовка Android это поможет вам в 2020 году


Ваши последние пару ответов ссылаются на один и тот же сайт. Вы связаны с этим сайтом? Если вы являетесь аффилированным лицом, вы должны раскрыть эту принадлежность в сообщении . Если вы не раскрываете принадлежность, это считается спамом. Видеть: Что означает "Хорошая" самореклама? , Некоторые советы и рекомендации о саморекламе , Что такое точное определение понятия «спам» для переполнения стека? и что делает что-то спамом .
Макьен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.