关于android navigation的相关问题

是这样,我想做一个和网易云和qq类似的抽屉+底部导航。因为刚学android没几天,也不知道现在的安卓app都是一套什么方式。我是将android提供的模板进行改造,现在/%ra2就是返回键的问题没有解决。

先说下我的实现方式吧,这个是主界面

img

然后点击侧边栏菜单导航到新的activity,然后新的activity有一套自己的navigation。切换activity的时候根据点击的菜单选项传递相应的fragmentId(navigation.xml中的id),然后导航过去后就使用avController.navigate(id)导航到指定的页面,现在有一个问题就是navigation有一个初始目的地,我这样切换会先跳转到初始目的地然后再挑战到最终的fragment。这样我点击返回bar时就要点两下,包括返回键也一样。不过back键可以重写直接返回上一个activity,但是bar设置相同的模式却还是需要点两下才能返回主界面。这个要怎么做呢?

img

img

//主activity,监听进行跳转
 NavigationView navigationView = findViewById(R.id.nav_view_left);
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                Intent intent = new Intent(MainActivity.this,MainActivity2.class);
                switch (item.getItemId()){
                    case R.id.nav_news:
                        intent.putExtra("id",R.id.newsFragment);
                        break;
                    case R.id.nav_gallery:

                        intent.putExtra("id",R.id.galleryFragment);
                        break;
                    case R.id.nav_slideshow:

                        intent.putExtra("id",R.id.slideshowFragment);
                        break;


                }
                startActivityForResult(intent,3);
                return false;
            }
        });

跳转的activity

public class MainActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView2);
        NavController navController = navHostFragment.getNavController();
        AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder()
                .setFallbackOnNavigateUpListener(this::onSupportNavigateUp).build();
        Toolbar toolbar = findViewById(R.id.toolbar);
        NavigationUI.setupWithNavController(toolbar,navController,appBarConfiguration);

        int id = getIntent().getIntExtra("id", R.id.newsFragment);
        navController.navigate(id);
    }

    @Override
    public boolean onSupportNavigateUp() {
        Intent intent = new Intent();
        setResult(RESULT_OK,intent);
        finish();
        return true;
    }

    @Override
    public void onBackPressed() {

        Intent intent = new Intent();
        setResult(RESULT_OK,intent);
        finish();
    }
}

然后我想问一下目前的androidApp都是怎么安排的啊,是单Activity+多fragment还是多activity+多fragment呢?我看有人说谷歌官方推荐是前者,但我在官网最佳做法没找到,不知道这两个方式哪种好呢?

这种没怎么使用过,用另一种方式,相对简洁,
例如:

 <androidx.drawerlayout.widget.DrawerLayout
        android:id="@+id/drawlayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/white"/>

         
<!-- 这个就是侧滑的内容-->
        <include
            layout="@layout/header_layout"
            android:layout_width="match_parent"

            android:layout_height="match_parent"
            android:layout_gravity="left" />


    </androidx.drawerlayout.widget.DrawerLayout>

点击打开: drawlayout.openDrawer(Gravity.LEFT, false)

关闭: drawlayout.closeDrawers()
当然,也可以自己滑动拉开,那个不需要开发者处理

侧滑的布局控件按照正常的布局控件引用即可