Как сделать так, чтобы значок возврата вел себя так же, как физическая кнопка возврата в Android?

Я имею MainActivity а также SecondActivity,

AndroidManifest.xml

<activity
    android:name=".MainActivity"
    android:label="@string/app_name" >
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
    android:name=".SecondActivity"
    android:label="@string/title_activity_second_activitity"
    android:parentActivityName=".MainActivity" >
</activity>

Пока я нажимаю на иконку SecondActivity, более вероятно, что MainActivity толкается на SecondActivity, Вместо этого физическая кнопка возврата сделает SecondActivity всплывает и обратно MainActivity,

Как сделать так, чтобы значок стрелки назад вел себя так же, как физическая кнопка возврата?

5 ответов

Физическая кнопка "Назад" и кнопка "Назад" не должны работать в соответствии с рекомендациями Google. Но если вы хотите изменить его поведение, вам нужно переопределить его функциональность, выполнив следующее:

На вашем переопределении SecondActivity onOptionsItemSelected

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        onBackPressed();    //Call the back button's method
        return true;
    }

    return super.onOptionsItemSelected(item);
}

Также вам нужно удалить android:parentActivityName=".MainActivity" из вашего манифеста, но чтобы избежать удаления значка спинки, вам нужно включить его:

@Override
public boolean onCreate(Bundle savedInstanceState) {

    ...

    ActionBar actionBar = getActionBar();  //Make sure you are extending ActionBarActivity
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setHomeButtonEnabled(true);

    //It's also possible to use getSupportActionBar()
}

Ответ Карлоса работает. Есть и другой способ, который, на мой взгляд, более прост: просто добавьте прослушиватель щелчков прямо к значку "Назад".

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

Чтобы добиться такого поведения, вы можете определить launchMode вашей MainActivity как однооперационное действие. Это легко сделать в вашем манифесте, добавив следующую строку:

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:launchMode="singleTop" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity
    android:name=".SecondActivity"
    android:label="@string/title_activity_second_activitity"
    android:parentActivityName=".MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity" />
</activity>

Если вы хотите поддерживать API 15 и ниже, я бы порекомендовал добавить элемент метаданных внутри вашей SecondActivity, как вы можете видеть выше.

Вам нужно будет добавить 3 вещи, чтобы определить, какое действие вы хотите продолжить нажатием на спину, не помещать это действие в стек и заставить кнопку возврата вести себя так же, как физическая кнопка возврата.

1. Определите деятельность, в которую вы хотите войти, когда back button нажата.

В вашем manifest файла activity тег включает

<activity
        android:name=".SecondActivity"
        android:parentActivityName=".MainActivity" >
        <meta-data              //Use meta-data if you are using support library
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity" />

2. Переопределить onBackPressed метод внутри вашего SecondActivity.class файл, чтобы не нажимать MainActivity в стек при нажатии кнопки назад.

@Override
public void onBackPressed(){
    Intent i = new Intent(getApplicationContext(), MainActivity.class);
    startActivity(i);
    finish();
}

3. Используйте showHomeAsUpEnabled() установить кнопку назад в actionBar.

ActionBar().setDisplayHomeAsUpEnabled(true); или же getSupportActionBar().setDisplayHomeAsUpEnabled(true); если вы используете библиотеку поддержки.

@Override
    public void onBackPressed() {
       int mCount = pager.getCurrentItem();

        if(mCount>0){
            pager.setCurrentItem(0,false);
            firsticon.setBackgroundColor(Color.parseColor("#2B8C57"));
            secondicon.setBackgroundColor(Color.TRANSPARENT);
            thirdicon.setBackgroundColor(Color.TRANSPARENT);
            fourthicon.setBackgroundColor(Color.TRANSPARENT);
            fifthicon.setBackgroundColor(Color.TRANSPARENT);

        }else{
            this.finish();
        }

    }
Другие вопросы по тегам