簡體   English   中英

如何實現Android ActionBar 后退按鈕?

[英]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 中啟用:

安卓,API 5+:

@Override
public void onBackPressed() {
     ...
     super.onBackPressed();
}

ActionBarSherlock 和 App-Compat,API 7+:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

安卓,API 11+:

@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);
        }
    }
}

這樣你想要的所有活動都可以有后排。

安卓,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>

擴展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();
}

來源: https : //github.com/excilys/androidannotations

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方法中。

如果您使用的是工具欄,我也面臨着同樣的問題。 我按照這兩個步驟解決了

  1. 在 AndroidManifest.xml 中
<activity android:name=".activity.SecondActivity" android:parentActivityName=".activity.MainActivity"/>
  1. 在 SecondActivity 中,添加這些...
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM