Во многих приложениях (Календарь, Диск, Play Store), когда вы нажимаете кнопку и вводите новое действие, значок в строке заголовка превращается в кнопку "Назад", но для приложения, которое я создаю, он не делает что. Как заставить этот значок вернуться к предыдущему экрану?
Android - кнопка "Назад" в строке заголовка
Ответ 1
Есть два простых шага для создания кнопки "Назад" в строке заголовка:
Во-первых, сделайте значок приложения кликабельным, используя следующий код в упражнении, в строке заголовка которого вы хотите добавить кнопку "Назад":
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
После добавления вышеуказанного кода слева от значка приложения появится стрелка назад.
Во-вторых, после того, как вы сделали вышеупомянутое, вам все еще нужно создать код, который будет использовать преимущество нажатия кнопки. Для этого onOptionsItemSelected
в onOptionsItemSelected
что когда вы действительно нажимаете на значок приложения, onOptionsItemSelected
метод onOptionsItemSelected
. Поэтому, чтобы вернуться к предыдущему действию, добавьте этот метод в свое действие и вставьте в него код Intent
, который вернет вас к предыдущему действию. Например, допустим, что MyActivity
к MyActivity
вы пытаетесь вернуться, называется 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);
Ответ 2
используйте этот код
@Override
public void onCreate(Bundle savedInstanceState) {
...
getActionBar().setDisplayHomeAsUpEnabled(true);
}
после этого напишите этот код в onOptionsItemSelected
методе
int id = item.getItemId();
if (id==android.R.id.home) {
finish();
}
Ответ 3
Наконец-то мне удалось правильно добавить кнопку возврата в панель действий/панель инструментов
@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;
}
Ответ 4
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 и используйте static-метод NavUtils.navigateUpFromSameTask() для перемещения броска стека.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar Up/Home button
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
Однако использование navigateUpFromSameTask() подходит только тогда, когда ваше приложение является владельцем текущей задачи (то есть пользователь начал эту задачу из вашего приложения). Если это не так, и ваша деятельность была запущена в задача, относящаяся к другому приложению, затем для навигации вверх следует создать новая задача, которая принадлежит вашему приложению, которая требует, чтобы вы создали новый задний стек.
Ответ 5
Если ваша активность расширяет Activity
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);
[...]
}
[...]
}
Ничего больше, см. Добавить действие
[ДОПОЛНИТЕЛЬНО] Чтобы явно определить родительскую активность, измените свой манифест .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>
Ответ 6
Самый простой способ и лучшие практики, как Google объясняет здесь:
1. Добавьте родителя для вашего childActivity в AndroidManifest.xml
:
<activity
android:name=".ChildActivity"
android:parentActivityName=".ParentActivity" >
</activity>
2. Активируйте кнопку "Назад" в вашем ребенке.
myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);
Работал для меня, я надеюсь, что это работает и для вас.
Ответ 7
в первую очередь в функцию 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);
}
Ответ 8
Если вы используете новую библиотеку поддержки для 5.1 в студии Android, вы можете вместо этого использовать ее на своем AppCompatActivity
ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp);
actionBar.setDisplayShowHomeEnabled(true);
приветствий.
Ответ 9
Сначала вам нужно написать этот код
@Override
protected void onCreate(Bundle savedInstanceState) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
Затем добавьте эту строку в манифест
<activity android:name=".MainActivity"
android:parentActivityName=".PreviousActivity"></activity>
Я думаю, что это будет работать
Ответ 10
Если ваша активность продолжается 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()
, чтобы кнопка "Назад" на телефоне и стрелка на панели инструментов сделали то же самое.
Ответ 11
Легкая версия без использования ActionBarActivity
, у которой все еще есть те же baaviors здесь:
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
.
Ответ 12
Если вы используете ActionBar, вы захотите прочитать эту документацию http://developer.android.com/reference/android/app/ActionBar.html#setDisplayHomeAsUpEnabled(boolean)
Затем вам нужно перезаписать метод onOptionsItemSelected (MenuItem) и посмотреть, какое событие Android.R.id.home зайдет. Тогда вы знаете, что пользователь нажал на эту кнопку на панели действий
Ответ 13
Вам нужно добавить указанный ниже код в файл манифеста. Найдите активность, в которой вы хотите добавить функциональность обратной стрелки. Если вы найдете тот, который затем прекратите или создайте действие
<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");
}
Вот как я решил проблему. Спасибо.
Ответ 14
Мне нужно было смешать несколько ответов, чтобы получить правильный ответ для меня, потому что в моем приложении есть 3 действия, которые могут быть возвращены в любое время. Деятельность 1> Деятельность 2> Деятельность 3. Когда я что-то делал в своей деятельности 3, кнопка "Назад" правильно выполняла задание "Деятельность 2". Однако из 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()
.
Ответ 15
Вы также можете просто положить onBackPressed()
в свой прослушиватель onClick. Это заставляет вашу кнопку действовать как кнопки "назад/вверх" по умолчанию в приложениях для Android!
Ответ 16
Это также можно сделать без кода, указав родительскую активность в манифесте приложения Если вы хотите кнопку "Назад" в Activity B, которая перейдет в Activity A, просто добавьте Activity A в качестве родителя Activity B в манифесте.
Ответ 17
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);
}
Ответ 18
Это работает для меня.. Предположим, есть два вида деятельности (Activityone, Activitytwo)
Внутри Activityвсе используем этот код
@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>
И результат будет таким
Ответ 19
Для котлина:
override fun onOptionsItemSelected(item: MenuItem): Boolean {
onBackPressed();
return true;
}
Ответ 20
Другие ответы не упоминают, что вы также можете установить это в 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" />
Ответ 21
Просто делюсь тем, что помогло мне и может быть полезным для других. Хотя большинство ответов здесь верны, с помощью getActionBar().setDisplayHomeAsUpEnabled(true);
это не работает для меня. Проблема, с которой я столкнулся, заключалась в том, что я пытался создать второе действие вручную, но в нем есть больше деталей.
Что действительно решило мою проблему, так это следование учебному пособию для разработчиков Android (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.
Ответ 22
Я видел так много комплексных ответов, так что это мой код. Работает здесь. Вы можете достичь этого двумя способами.
1) Совместимость со стандартом Android
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) Используйте пользовательский значок
Если вы хотите использовать код в комментариях, вам просто нужно добавить этот файл в drawable, который называется 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();
}
});
Надеюсь, это поможет некоторым людям здесь!
Ответ 23
Это работает для меня getSupportActionBar(). SetDisplayHomeAsUpEnabled (false); введите описание изображения здесь