【问题标题】:Android Jetpack Navigation component Condtional navigation issueAndroid Jetpack Navigation 组件条件导航问题
【发布时间】:2020-09-22 17:52:01
【问题描述】:

我试图在this 之后添加条件导航。但是我遇到了一个问题。 所以我遵循的步骤是:

  1. MainActivity 中创建navigation drawer,以HomeFragment 作为起始目的地。
  2. 有条件地从 BlankFragment 导航到 FromBlackFragment
  3. 想通过点击up/back buttonFromBlackFragment转到HomeFragment

问题在于上面的第 3 步。我将通过单击back button 返回HomeFragment,而我在up button 上单击导航到BlankFragment步骤 3 的代码是:(在 FromBlackFragment.java 文件中)

requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
                new OnBackPressedCallback(true) {
                    @Override
                    public void handleOnBackPressed() {
                        Navigation.findNavController(view).popBackStack(R.id.homeFragment, false);
                    }
                });

MainActivity.java 文件:

public class MainActivity extends AppCompatActivity {

    private NavController navController;
    private DrawerLayout drawerLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.my_toolbar);
        drawerLayout = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        navController = findNavController(this, R.id.nav_host_fragment);
        AppBarConfiguration appBarConfiguration =
                new AppBarConfiguration.Builder(navController.getGraph())
                        .setOpenableLayout(drawerLayout).build();
        NavigationUI.setupWithNavController(toolbar, navController, appBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        return NavigationUI.onNavDestinationSelected(item, navController)
                || super.onOptionsItemSelected(item);
    }
}

BlankFragment.java 文件:

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank, container, false);
    }

    @Override
    public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        SharedPreferences sp = requireActivity().getSharedPreferences("Testing",0);
        if(!sp.getBoolean("b",false)){
            SharedPreferences.Editor editor = sp.edit();
            editor.putBoolean("b",true);
            editor.apply();
            Navigation.findNavController(view).navigate(R.id.fromBlackFragment);
        }
    }

FromBlackFragment.java 文件:

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_from_black, container, false);
    }

    @Override
    public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
                new OnBackPressedCallback(true) {
                    @Override
                    public void handleOnBackPressed() {
                        Navigation.findNavController(view).popBackStack(R.id.homeFragment, false);
                    }
                });
    }

注意:代码中使用的共享首选项不是问题的一部分。

请帮忙。谢谢。

编辑:(更具体的问题是)如何同步 upNavigation后退按钮

【问题讨论】:

    标签: android android-jetpack android-navigation android-jetpack-navigation


    【解决方案1】:

    Step1:在MainActivity的onCreate中,需要调用setSupportActionBar(toolbar);

    第二步:从 NavigationUI 调用 setupActionBarWithNavController(),传入正确的参数,这将:

    设置返回的 ActionBar AppCompatActivity.getSupportActionBar() 与 NavController 一起使用。

    第 3 步:通过调用 setupActionBarWithNavController(),您现在应该覆盖 onSupportNavigateUp(),调用以进行导航:

       @Override
        public boolean onSupportNavigateUp() {
            NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
            return NavigationUI.navigateUp(navController, appBarConfiguration)
                    || super.onSupportNavigateUp();
        }
    

    如果 NavigationUI.navigateUp 无法将您带到主片段目的地,您可能需要调用显式将您带到那里的 Navigation 方法。

    【讨论】:

    • 它让我到达 HomeFragment on BackButton click 但不是 upNavigation 这意味着它们没有同步。那么你知道如何同步它们吗?您上面的解决方案没有解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2020-01-15
    相关资源
    最近更新 更多