Как реализовать в ActionBar на Android кнопки "Назад"?
У меня есть деятельность с listview. Когда пользователь нажимает на элемент, открывается элемент "просмотр":
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);
}
});
это работает нормально, но на панели действий стрелка назад рядом со значком приложения не активируется. Я что-то упустил?
8 ответов:
Селвин уже выложили правильный ответ, вот только решение в довольно код ;-)
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>http://developer.android.com/design/patterns/navigation.html#up-vs-back
убедитесь, что ваша кнопка ActionBar Home включена в действии:
Android, API 5+:
@Override public void onBackPressed() { ... super.onBackPressed(); }ActionBarSherlock и App-Compat, API 7+:
@Override public void onCreate(Bundle savedInstanceState) { ... getSupportActionBar().setDisplayHomeAsUpEnabled(true); }Android, API 11+:
@Override public void onCreate(Bundle savedInstanceState) { ... getActionBar().setDisplayHomeAsUpEnabled(true); }пример
MainActivityчто расширяетActionBarActivity:public class MainActivity extends ActionBarActivity { @Override public void onCreate(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); } } }таким образом, все действия, которые вы хотите, могут иметь backpress.
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(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); } }
чтобы включить кнопку ActionBar back, Вам, очевидно, нужна панель действий в вашей деятельности. Это набор темы. Вы можете установить тему для своей деятельности в
AndroidManfiest.xml. Если вы используете, например,@android:style/Theme.NoTitleBarтема, у вас нет панели действий. В этом случае вызовgetActionBar()вернет null. Поэтому сначала убедитесь, что у вас есть панель действий.следующий шаг-установить
вы можете включить кнопку "Назад" вandroid:parentActivityNameк деятельности, которую вы хотите перейти, если вы нажмете кнопку Назад. Это должно быть сделано в элементAndroidManfiest.xmlтоже.onCreateметод "детской" деятельности.@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getActionBar().setDisplayHomeAsUpEnabled(true); }теперь вы должны реализовать логику для кнопки Назад. Вы просто переопределяете
onOptionsItemSelectedметод в вашей" дочерней "деятельности и проверьте идентификатор кнопки "Назад", котораяandroid.R.id.home.теперь вы можете запустить метод
NavUtils.navigateUpFromSameTask(this);но если вы не указалиandroid:parentActivityNameВ выAndroidManfiest.xmlэто приведет к краху приложения.иногда это то, что вы хотите, потому что его напоминает вам, что вы забыли "что-то", но если вы хотите, чтобы предотвратить это, вы можете проверить, если ваша деятельность имеет родителя с помощью
getParentActivityIntent()метод. Если это возвращает null, вы не указали родителя.в этом случае вы можете уволить
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().это зависит от вас, какую дорогу вы берете, но я нашел решение полезным, особенно если вы используете базовый класс для всех ваших действий.
файл 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); }это работает :]
Я думаю
onSupportNavigateUp()Это самый простой и лучший способ сделать этопроверьте код по этой ссылке Нажмите здесь для полного кода
https://stackoverflow.com/a/46903870/4489222
чтобы достичь этого, есть просто два шага,
Шаг 1: Перейти к AndroidManifest.xml и в добавить параметр в теге-android: parentActivityName=".жилище.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);} }
следующие шаги достаточно много, чтобы вернуться кнопку:
Шаг 1: Этот код должен быть в Манифесте.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));
Comments