Android - кнопка Назад в строке заголовка
во многих приложениях (календарь, диск, Play Store) при нажатии кнопки и вводе нового действия значок в строке заголовка превращается в кнопку назад, но для приложения, которое я делаю, это не так. Как сделать так, чтобы этот значок вернул вас на предыдущий экран?
15 ответов:
есть два простых шага, чтобы создать кнопку "Назад" в заголовке:
во-первых, сделайте значок приложения кликабельным, используя следующий код в строке заголовка действия, в которой вы хотите иметь кнопку "Назад":
ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true);
после того, как вы добавили приведенный выше код, вы увидите стрелку назад слева от значка приложения.
во-вторых, после того как вы сделали выше, вы все еще должны создать код это позволит воспользоваться событием click. Для этого имейте в виду, что при фактическом нажатии на значок приложения вызывается метод onOptionsItemSelected. Поэтому, чтобы вернуться к предыдущему действию, добавьте этот метод в свою активность и поместите в него код намерения, который вернет вас к предыдущему действию. Например, предположим, что действие, к которому вы пытаетесь вернуться, называется MyActivity. Чтобы вернуться к нему, напишите метод следующим образом:
public boolean onOptionsItemSelected(MenuItem item){ Intent myIntent = new Intent(getApplicationContext(), MyActivity.class); startActivityForResult(myIntent, 0); return true; }
вот именно!
(В Android developers API он рекомендует возиться с манифестом и добавлять такие вещи, как android:parentActivityName. Но это, кажется, не работает для меня. Вышесказанное проще и надежнее.)
<meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity" />
и в ваших действиях
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
используйте этот код
@Override public void onCreate(Bundle savedInstanceState) { ... getActionBar().setDisplayHomeAsUpEnabled(true); }
после этого пишите этот код
onOptionsItemSelected
методint id = item.getItemId(); if (id==android.R.id.home) { finish(); }
мне наконец-то удалось правильно добавить кнопку Назад в actionbar/toolbar
@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; }
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 () подходит только для вашего приложения является владельцем текущей задачи (то есть пользователь начал эту задачу из вашего приложения). Если это не так, и ваша деятельность была начата в задача, которая принадлежит другому приложению, а затем навигация вверх должна создать новая задача, принадлежащая вашему приложению, которая требует создания новый задний стек.
Если ваша деятельность не распространяется действие
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>
посмотреть укажите родительскую активность
самый простой способ и лучшая практика, как объясняет google здесь:
1.Добавьте родителя для вашего childActivity в
AndroidManifest.xml
:<activity android:name=".ChildActivity" android:parentActivityName=".ParentActivity" > </activity>
2.Активировать кнопку "Назад" в вашем childActivity :
myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);
работала на меня, я надеюсь, что это работает для вас тоже.
Если вы используете новую библиотеку поддержки для 5.1 в Android studio, вы можете вместо этого использовать это на вашем AppCompatActivity
ActionBar actionBar = getSupportActionBar(); actionBar.setHomeButtonEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp); actionBar.setDisplayShowHomeEnabled(true);
ура.
прежде всего в функции 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); }
если ваша деятельность распространяется
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()
поэтому кнопка "назад" на телефоне и стрелка на панели инструментов сделать то же самое.
Если вы используете панель действий, вы захотите прочитать эту документацию http://developer.android.com/reference/android/app/ActionBar.html#setDisplayHomeAsUpEnabled(boolean)
затем вы должны перезаписать метод onOptionsItemSelected (MenuItem) и искать событие android.R.id.home, чтобы войти. Тогда вы знаете, что пользователь нажал на эту кнопку назад на панели действий
облегченная версия без использования
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
.
вам нужно добавить приведенный ниже код в файл манифеста. Найдите действие, в которое вы хотите добавить функцию стрелки назад. Если вы найдете тот, то штраф или создать деятельность
<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"); }
вот как я решил проблема. Спасибо.
вы также можете просто поставить
onBackPressed()
в вашем прослушивателе onClick. Это заставляет вашу кнопку действовать как кнопки "назад/вверх" по умолчанию в приложениях android!
Это также можно сделать без кода, указав родительскую активность в манифесте приложения Если вы хотите кнопку "Назад" в действии B, которая будет получать действие A, просто добавьте действие A в качестве родителя действия B в манифесте.
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); }