如何在打开的 activity 的操作栏中的片段中添加后退按钮?

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

我有一个 HomeActivity 实现 NavigationView 不带 ToolBar(带 ActionBar)。在这个 activity 中,我实现了 onNavigationItemSelected 用于导航到 SettingsFragment:

    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 片段中我有一个监听器打开一个新的 activity:

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

它打开一个 activity 但没有返回到上一个片段的按钮。在操作栏中添加此按钮的正确方法是什么?

编辑:我希望按钮返回到前一个片段SettingsFragment,而不是返回到包含片段的activity。为什么实施 NavigationView 如此困难?

您的 SubSettingsActivity 的主题应该扩展 Theme.AppCompat.Light.DarkActionBar
然后在 java 中执行 onCreate

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

然后在 AndroidManifest 中你声明 SubSettingsActivity 做:

android:parentActivity="YOUR_ACTIVITY"

YOUR_ACTIVITY 是 activity 持有 fragment

编辑: 如果您想导航回 SettingFragment,最好使用 Android Jetpack 导航组件。 它让你无缝地使用片段。 这是 link: 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 步: 由于您的片段已创建,请转到包含片段的 activity 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 时,它是导航图中可见的开始片段。

卷曲箭头是动作或导航。例如,在我的屏幕截图中,起始片段转到注册片段和登录片段,它仅表示起始片段可以导航到图形内片段的位置。如果它没有在导航图中定义,它就不会导航。换句话说,嘿 nav 我以后会想从启动片段导航到注册片段或登录片段,注意!

第 5 步: 当您想从图形中的片段导航到片段时实例化 NavController 的实例:

     private NavController controller;

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

        controller = Navigation.findNavController(view);
    }

NavController 会让你导航,我通常在 ViewCreated()

上实例化它

然后:

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

要使用片段设置操作栏,请将以下代码放入主机 activity 的 onCreate() 中:

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

也在主机中 activity:

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

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

}

Check this video for more