Правильный способ справиться с кнопкой вверх?
Я использую ActionBarSherlock (хотя я не думаю, что это имеет значение).
У меня есть Основная деятельность и О деятельности. Я хочу, чтобы действие About показывало стрелку назад в виде логотипа и выполняло надлежащую анимацию и тому подобное. Я не знаю, как сделать это правильно.
В настоящее время я под onOptionsMenuItemSelected запускать основное действие, когда нажата кнопка "Вверх / Домой", но оно взломано и не работает должным образом. Он воспроизводит неправильную анимацию и плохо справляется с многозадачностью.
Как мне правильно это настроить?
Вот часть моей основной деятельности, которая запускает About:
Intent aboutIntent = new Intent(MainActivity.this, About.class);
MainActivity.this.startActivity(aboutIntent);
Вот моя О деятельности:
package com.stevenschoen.test;
import android.content.Intent;
import android.os.Bundle;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.MenuItem;
public class About extends SherlockActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.about);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowTitleEnabled(false);
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// app icon in action bar clicked; go home
Intent intentHome = new Intent(this, MainActivity.class);
intentHome.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intentHome);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
7 ответов
В корне моей проблемы обнаружилось изменение в манифесте, который я сделал некоторое время назад: я добавил эту строку:
android:launchMode="singleInstance"
поэтому моя основная деятельность не будет возобновлена. Меняя это на:
android:launchMode="singleTask"
решил мои проблемы, и я смог удалить все onOptionsItemSelected
вещи. Я знал, что что-то не так, что Android должен был справиться с этим лучше, и я был прав. Проверьте манифест:P
Вы также пробовали это (взято с сайта Android здесь):
в манифесте для каждого действия X, которое нужно перейти к основному действию, добавьте это в код:
@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);
}
и это к его явному тегу XML:
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.activities.MainActivity" />
если вам нужно сохранить то же состояние в основной деятельности, используйте этот код:
Intent intent = NavUtils.getParentActivityIntent(this);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
NavUtils.navigateUpTo(this, intent);
если API равен 16 или выше, вместо метаданных вы можете добавить атрибут parentActivityName с путем к основному действию.
Вы можете обработать кнопку панели действий, используя код или XML.
Проверьте этот код
если вы хотите это программно, добавьте эту строку в метод onCreate()
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
И переопределить этот метод onSupportNavigateUp()
@Override
public boolean onSupportNavigateUp(){
finish();
return true;
}
ИЛИ Не программно вы можете добавить мета в файл манифеста как
<activity android:name="Current Activity"
android:parentActivityName="Activity you want to open">
</activity>
Примечание: убедитесь, что Actionbar не является нулевым.
В вашем onCreate(Bundle savedInstanceState)
, делать
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
Тогда в вашем onOptionsItemSelected(MenuItem item)
, делать
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// go to previous screen when app icon in action bar is clicked
Intent intent = new Intent(this, PreviousActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
}
return super.onOptionsItemSelected(item);
}
Для тех, кто хочет просто вернуться к предыдущему упражнению, это самое простое решение:
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish(); //this method close current activity and return to previous
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings2);
//here is to put the up back button in the Activity
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
// here is the code to handle to go back to the activity which sent you to this current one
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
onBackPressed();
}
return super.onOptionsItemSelected(item);
}
Убедитесь, что ваш android:minSdkVersion="11", который можно увидеть в файле манифеста, значок APK был включен из APK 11. Я сделал небольшой пример плз, попробуйте ссылку ниже, которая может помочь вам просто импортировать в рабочее пространство