Як реалізувати кнопку назад Android ActionBar?


137

У мене є діяльність із переглядом списку. Коли користувач натискає елемент, відкриється пункт "переглядач":

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

Відповіді:


264

Селвін вже розмістив правильну відповідь. Ось, рішення в досить ситному коді:

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
У моїй ситуації я шукав спосіб не закликати створювати батьків при поверненні до нього. Для цього я використовував вашу реалізацію, але називав закінчення () замість NavUtils.navigateUpFromSameTask (це). закінчення () викликає мій onStart замість onCreate, який був для мене більш ідеальним.
Джон

Встановлення метаданих у маніфесті є ключовим фактором для роботи кнопки навігації
VSB

Використовуйте getActionBar().setDisplayHomeAsUpEnabled(true);корпус, який використовуєте бібліотеки підтримки.
Абхінав Упадхей

Як ви змінюєте напрямок «витирання»? За замовчуванням реалізація цієї задньої навігації переміщує екран справа наліво, і схоже на завантаження нового екрана. Однак я хочу, щоб він стирався зліва направо, як і натискання на власну кнопку назад.
stingray_

Я отримав помилку: викликано: java.lang.NullPointerException: спроба викликати віртуальний метод 'void android.app.ActionBar.setDisplayHomeAsUpEnabled (boolean)' у нульовій посиланні на об'єкт
Джонс

166

Переконайтеся, що ваша домашня кнопка 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); в getActionBar (). setDisplayHomeAsUpEnabled (true); і додав ці @SuppressLint ("NewApi") у методі onCreate всередині та зовніFor REF: => developer.android.com/training/implementing-navigation/…
gnganpath

1
@ganpath Обережно, використання getActionBar призначено для API 11+ .
Джаред Берроуз

17

Щоб увімкнути кнопку повернення ActionBar, вам очевидно потрібен ActionBar у своїй діяльності. Це встановлюється темою, яку ви використовуєте. Ви можете встановити тему своєї активності в розділі AndroidManfiest.xml. Якщо ви використовуєте, наприклад, @android:style/Theme.NoTitleBarтему, у вас немає ActionBar. У цьому випадку виклик до getActionBar()повернеться недійсним. Тому спочатку переконайтеся, що у вас є ActionBar.

Наступним кроком є ​​встановлення android:parentActivityNameактивності, якою ви хочете орієнтуватися, якщо натиснути кнопку назад. Це теж слід робити AndroidManifest.xml.

Тепер ви можете ввімкнути кнопку "назад" у onCreateметоді своєї "дитячої" діяльності.

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

Тепер слід реалізувати логіку кнопки "назад". Ви просто перекриєте onOptionsItemSelectedметод у своїй "дитячій" діяльності та перевіряєте, чи є ідентифікатор кнопки "Назад" android.R.id.home.

Тепер ви можете запустити метод, NavUtils.navigateUpFromSameTask(this); але якщо ви не вказали, android:parentActivityNameу вас AndroidManifest.xmlце призведе до збою вашої програми.

Іноді це те, чого ти хочеш, тому що це нагадує тобі, що ти забув "щось". Тож якщо ви хочете запобігти цьому, ви можете перевірити, чи є у вашої активності батько, використовуючи getParentActivityIntent()метод. Якщо це значення повернеться до нуля, ви не вказали батьківську.

У цьому випадку ви можете запустити 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

Щоб досягти цього, достатньо двох кроків,

Крок 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

Якщо ви використовуєте Панель інструментів, я зіткнувся з тією ж проблемою. Я вирішив, виконавши ці два кроки

  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

Спираючись на відповідь Джареда, мені довелося ввімкнути та реалізувати поведінку кнопки повернення кнопок дій у кількох заходах і створив цей клас помічників для зменшення дублювання коду.

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