[英]How to implement the Android ActionBar back button?
我有一個帶有列表視圖的活動。 當用戶單擊該項目時,項目“查看器”將打開:
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);
}
});
這工作正常,但在操作欄上,應用程序圖標旁邊的后退箭頭沒有被激活。 我錯過了什么嗎?
塞爾文已經發布了正確的答案。 在這里,漂亮的代碼中的解決方案:
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>
請參閱此處進一步閱讀。
確保您的 ActionBar Home Button 在 Activity 中啟用:
@Override
public void onBackPressed() {
...
super.onBackPressed();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
...
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
...
getActionBar().setDisplayHomeAsUpEnabled(true);
}
擴展ActionBarActivity
示例MainActivity
:
public class MainActivity extends ActionBarActivity {
@Override
public void onCreate(@Nullable 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);
}
}
}
這樣你想要的所有活動都可以有后排。
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>
擴展ActionBarActivity
示例MainActivity
:
public class MainActivity extends ActionBarActivity {
@Override
public void onCreate(@Nullable 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 后退按鈕,您顯然需要在 Activity 中使用 ActionBar。 這是由您使用的主題設置的。 您可以在AndroidManfiest.xml
為您的活動設置主題。 如果您使用例如@android:style/Theme.NoTitleBar
主題,則您沒有ActionBar。 在這種情況下,對getActionBar()
的調用將返回 null。 因此,請先確保您有一個 ActionBar。
下一步是將android:parentActivityName
設置為按后退按鈕時要導航的活動。 這也應該在AndroidManifest.xml
完成。
現在,您可以在“子”活動的onCreate
方法中啟用后退按鈕。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActionBar().setDisplayHomeAsUpEnabled(true);
}
現在您應該實現后退按鈕的邏輯。 您只需覆蓋“子”活動中的onOptionsItemSelected
方法並檢查后退按鈕的 id,即android.R.id.home
。
現在你可以觸發方法NavUtils.navigateUpFromSameTask(this);
但是,如果您沒有在AndroidManifest.xml
指定android:parentActivityName
,這將使您的應用程序崩潰。
有時這就是你想要的,因為它提醒你忘記了“某事”。 因此,如果您想防止這種情況發生,您可以使用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);
之間是不同的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>
添加詳細信息活動:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
是工作 :]
@OptionsItem(android.R.id.home)
void homeSelected() {
onBackPressed();
}
在OnCreate
方法中添加:
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
然后添加這個方法:
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
我認為onSupportNavigateUp()
是最簡單也是最好的方法
在下面的 stackoverflow 答案中查看完整的解決方案。 鏈接: 點此查看完整代碼
https://stackoverflow.com/a/46903870/4489222
要實現這一點,只需兩個步驟,
第 1 步:轉到 AndroidManifest.xml 並在標簽中添加參數 - android:parentActivityName=".home.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 步:此代碼應在 Manifest.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));
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
在新 api 的onCreated
方法中。
如果您使用的是工具欄,我也面臨着同樣的問題。 我按照這兩個步驟解決了
<activity android:name=".activity.SecondActivity" android:parentActivityName=".activity.MainActivity"/>
Toolbar toolbar = findViewById(R.id.second_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
基於 Jared 的回答,我必須在幾個活動中啟用和實現操作欄后退按鈕行為,並創建了這個幫助器類來減少代碼重復。
public final class ActionBarHelper {
public static void enableBackButton(AppCompatActivity context) {
if(context == null) return;
ActionBar actionBar = context.getSupportActionBar();
if (actionBar == null) return;
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
活動中的用法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
ActionBarHelper.enableBackButton(this);
}
我自己也在嘗試這個,還有一件事對我有用:
when(item.itemId) {
R.id.action_signup -> signup() //other menu item
android.R.id.home -> viewRoot.findNavController().navigateUp() //back
}
return super.onOptionsItemSelected(item)
}
我正在使用 Jetpack 導航,因此這是獲取 NavController 的調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.