簡體   English   中英

如何在已打開活動的操作欄中向片段添加后退按鈕?

[英]How to add a back button to the fragment in the action bar of an opened activity?

我有一個HomeActivity ,它實現了沒有 ToolBarNavigationView (帶有 ActionBar)。 在此活動中,我實現了用於導航到SettingsFragmentonNavigationItemSelected

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);

        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeButtonEnabled(true);
        }

        // more code
        getSupportFragmentManager().beginTransaction().replace(R.id.container,new DashboardActivity()).commit();
    }


    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                // more code
                getSupportFragmentManager().beginTransaction().replace(R.id.container,new SettingsFragment()).commit();
    }

SettingsFragment片段中,我有一個監聽器來打開一個新活動:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        fragmentView = inflater.inflate(R.layout.activity_settings, container, false);
        FloatingActionButton fab = (FloatingActionButton) fragmentView.findViewById(R.id.myfab);
        fab.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getActivity(), SubSettingsActivity.class);
                fragmentView.getContext().startActivity(intent);
                startActivity(intent);
            }
        });
        return fragmentView;
    }

它打開一個活動,但沒有返回前一個片段的按鈕。 在操作欄中添加此按鈕的正確方法是什么?

編輯:我希望 go 的按鈕回到上一個片段SettingsFragment而不是保存片段的活動。 為什么實現NavigationView這么難?

您的 SubSettingsActivity 的主題應該擴展Theme.AppCompat.Light.DarkActionBar
然后在 java 中做 onCreate

        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeButtonEnabled(true);
        }

然后在您聲明 SubSettingsActivity 的 AndroidManifest 中執行以下操作:

android:parentActivity="YOUR_ACTIVITY"

YOUR_ACTIVITY 是持有片段的活動

編輯:如果你想導航回 SettingFragment,最好使用 Android Jetpack 導航組件。 它讓你無縫地使用碎片。 這是鏈接: https://developer.android.com/guide/navigation/navigation-migrate

如何實現導航組件:簡單的方法

第 1 步:添加所需的依賴項

implementation 'androidx.navigation:navigation-fragment:2.3.0-alpha05'
implementation 'androidx.navigation:navigation-ui:2.3.0-alpha05'

步驟 2:轉到 Android Studio 上的 res 文件夾,右鍵單擊它,新建 > android 資源文件 您將看到以下對話框: 見截圖

注意資源類型,您必須選擇導航

第 3 步:由於您的片段已創建,請轉到包含您的片段的活動 xml,例如 activity_main.xml 添加以下內容:

<fragment
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@id/adView"
    android:name="androidx.navigation.fragment.NavHostFragment"
    app:defaultNavHost="true"
    app:navGraph="@navigation/main_nav"
    android:id="@+id/nav_host_frag"/>

NavHostFragment是將處理您的片段的 class , navGraph將是您之前創建的導航文件。

第 4 步:將您的片段添加到導航文件中,打開您在第 2 步中創建的導航文件,將選項卡切換到設計。 如下圖所示在此處輸入圖像描述

請注意,您的將是空的。 使用添加符號(屏幕截圖中的 1)將您的片段添加到設計視圖中。 注意(屏幕截圖中的 2)開始片段,這是首先膨脹的片段。 意味着當你打開 MainActivity 時,它在導航圖中的起始片段將是可見的。

卷曲箭頭是操作或導航。 例如,在我的屏幕截圖中,起始片段轉到注冊片段和登錄片段,它僅表示起始片段可以在圖表內的片段中導航到的位置。 如果未在導航圖中定義,則不會導航。 換句話說,嘿導航我將來會想要從啟動片段導航到注冊片段或登錄片段,請注意!

第 5 步:當您想從圖中的片段導航到片段時,實例化 NavController 的實例:

     private NavController controller;

     @Override
     public void onViewCreated(@NonNull View view, @Nullable Bundle 
     savedInstanceState) {
       super.onViewCreated(view, savedInstanceState);

        controller = Navigation.findNavController(view);
    }

NavController將讓您導航,我通常將其實例化為 onViewCreated()

然后:

button.setOnClickListener(new View.OnClickListener(){
  @Override
   public void onClick(View view){
      controller.navigate(R.id.action_startFragment_to_anotherFragment);
   }
 }); 

要使用片段設置您的操作欄,請將以下代碼放入主機活動的 onCreate() 中:

      NavController mNavigationController = Navigation.findNavController(this,R.id.nav_host_frag);
      NavigationUI.setupActionBarWithNavController(this, mNavigationController);

同樣在主機活動中:

@Override
public boolean onSupportNavigateUp() {
    return mNavigationController.navigateUp();
}

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

}

查看此視頻了解更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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