如何在打开的活动的动作栏中向片段添加后退按钮?

问题描述 投票:1回答:1

我有一个HomeActivity实现了NavigationView 没有ToolBar(带有ActionBar)。在本活动中,我实现用于导航至onNavigationItemSelectedSettingsFragment

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

它打开一个活动,但没有上一个片段的后退按钮。在操作栏中添加此按钮的正确方法是什么?

EDIT:我希望按钮返回到先前的片段SettingsFragment,而不是保存片段的活动。为什么实现NavigationView如此困难?

java android android-layout navigationview
1个回答
1
投票

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

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

然后在AndroidManifest中,您声明SubSettingsActivity做:

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上的goto res文件夹,右键单击它,新建> android资源文件您会看到以下对话框:See Screenshot

注意资源类型,必须选择导航

[第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是将处理您的片段的类,navGraph将是您先前创建的导航文件。

[步骤4:将片段添加到导航文件,打开在步骤2中创建的导航文件,将选项卡切换为设计。如下图所示enter image description here

注意您的将是空的。使用加号(屏幕截图中的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();

}

Check this video for more

© www.soinside.com 2019 - 2024. All rights reserved.