Как сделать так, чтобы значок возврата вел себя так же, как физическая кнопка возврата в 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();
}
}