Android - кнопка "Назад" у рядку заголовка


111

У багатьох додатках (Календар, Диск, Play Маркет), коли натискаєте кнопку та вводите нову активність, значок у заголовку ряду перетворюється на кнопку назад, але для програми, яку я створюю, це не робиться. Як змусити цей значок повернути вас до попереднього екрана?


Спробуйте getSupportActionBar () у прикладі OnCreate тут freakyjolly.com/how-to-add-back-arrow-in-android-activity
Code Spy

Відповіді:


145

Для створення кнопки "Назад" у рядку заголовка є два простих кроки:

Спочатку переконайтесь, що піктограму програми можна натискати за допомогою наступного коду в тій діяльності, у заголовку якої потрібно натиснути кнопку "Назад":

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

Це воно!

(В API для розробників Android він рекомендує возитися з маніфестом і додавати подібні речі android:parentActivityName. Але це, здається, не працює для мене. Вищенаведене простіше і надійніше.)

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

І у вашій діяльності

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

23
Ви добре пояснили, але якщо ви не помилилися у своєму OnOptionItemSelected, вам слід просто зателефонувати закінчити (); у вашому випадку startActivityForResult запустить другу активність, і коли ви натиснете назад з другої активності, ви повернетесь до першої активності (де ви натискаєте піктограму смужки дій)
Yahya Arshad

8
Більше того, ви повинні робити це лише в тому випадку, якщо item.getItemId () є android.R.id.home
bitek

2
Як зазначає AS: "Виклик методу" actionBar.setDisplayHomeAsUpEnabled (true) "може створити java.lang.NullPointerException"
statosdotcom

1
Увага! За допомогою ToolBar actionBar повертає нуль зі збоєм. Відповіді дивіться нижче.
CoolMind

5
getActionBar () не працював для мене, додаток просто виходить з ладу. getSupportActionBar () спрацював.
Джон Ктейджик

60

використовувати цей код

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

після цього напишіть цей код у onOptionsItemSelectedметоді

  int id = item.getItemId();

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

1
getActionBar()дає мені нуль; ти знаєш чому?
msysmilu

3
тому що немає ActionBar, наприклад зі стилем <item name = "android: windowActionBar"> false </item> <item name = "android: windowNoTitle"> true </item>
Пол Верест

47

Нарешті мені вдалося належним чином додати кнопку назад до панелі дій / панелі інструментів

@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
Арда Ç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
Це я саме шукав. Ти врятував мені день. Дуже дякую.
Таші Дендуп

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

Якщо ви використовуєте нову бібліотеку підтримки для 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

Найпростіший спосіб та найкраща практика, як пояснює google тут :

1.Додайте батька для своєї дитячої активності в AndroidManifest.xml:

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

2.Активуйте кнопку "Назад" у своїй дитині.

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

Працював для мене, я сподіваюся, що він працює і для вас.


це справедливо лише в тому випадку, якщо діяльність може мати лише одну батьківську діяльність. Це стосується мене. +1
MQoder

Крок 2 у моєму випадку не потрібен.
Томіо

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

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

Я бачив так багато комплексів відповіді, тож це мій код. Працюючи тут. Домогтися цього можна двома способами.

1) Сумісність з андроїд Stardard

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) Використовуйте спеціальний значок

Якщо ви хочете використовувати код у коментарях, вам просто потрібно додати цей файл у форматі Dravable, який називається 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.


Це відповідає новому віджету Панелі інструментів, який входить у бібліотеку підтримки. Дякую!!
Годинник

2

Вам потрібно додати вказаний нижче код у файл маніфесту. Шукайте активність, в якій потрібно додати функціональність стрілки назад. Якщо ви знайдете цю, то добре або створіть активність

<activity android:name=".SearchActivity">

</activity>

Потім додайте наступні три рядки коду між ними.

<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

В інших відповідях не зазначається, що ви також можете встановити це в XML свого Toolbarвіджета:

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

Це також можна зробити без коду, вказавши батьківську активність у маніфесті програми. Якщо ви хочете, щоб у списку "Активність B" була повернута кнопка "Зворотній зв'язок", просто додайте в маніфест активність "А" як батько діяльності "Б".



1

Мені потрібно було змішати кілька відповідей, щоб отримати правильну відповідь для мене, тому що в моєму додатку є 3 дії, які можна повернути і повернути в будь-який час. Діяльність1> Активність2> Активність3 Коли я щось робив над своєю діяльністю3, кнопка "Назад" поверталася правильно до Activity2. Однак із Activity2, використовуючи finish(), він переходив до Activity3, а не Activity1. І я розширюю 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

Просто поділитися чимось, що мені допомогло і може бути корисним для інших. Хоча більшість відповідей тут правильні, використовуючи getActionBar().setDisplayHomeAsUpEnabled(true);, для мене це не спрацювало. Проблема в мені полягала в тому, що я намагався створити другу активність вручну, але є додаткові деталі.
Що справді вирішило мою проблему, було слідувати підручнику Android Developers ( https://developer.android.com/training/basics/firstapp/starting-activity ) для створення другої діяльності за допомогою власних інструментів Android Studio:

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

Це працює для мене. Припустимо, є дві дії (Activityone, 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));

Це повинно бути включено до другої діяльності всередині файлу маніфесту

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.