繁体   English   中英

Android Navigation Drawer Activity 调用来自 Fragment 的 Click 事件

[英]Android Navigation Drawer Activity call Click event from Fragment

我在 Android Studio 中创建了一个导航抽屉活动项目并添加了一些片段。 浏览它们工作正常。

现在在主片段中,我想添加一些按钮,将用户带到一些片段,否则用户需要通过抽屉菜单导航到这些片段。 换句话说,当用户打开应用程序时,他应该可以选择在不打开抽屉菜单的情况下导航到某些片段。 但我无法让它工作。

到目前为止,我最接近的是在主要活动中使用以下代码。 但是,这只适用于一次。 当我导航到其他片段并 go 返回主片段时,它将不再起作用。 单击按钮应该与用户在抽屉菜单中导航一样。

public class MainActivity extends AppCompatActivity {

    private AppBarConfiguration mAppBarConfiguration;
    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        setSupportActionBar(binding.appBarMain.toolbar);
        binding.appBarMain.fab.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        DrawerLayout drawer = binding.drawerLayout;
        NavigationView navigationView = binding.navView;
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home, R.id.nav_hpfragment, R.id.nav_gallery, R.id.nav_slideshow)
                .setOpenableLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);

        Button btnTest = binding.getRoot().findViewById(R.id.btnGotoDensityAlt);
        View.OnClickListener cl = new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                View x = navigationView.findViewById(R.id.nav_hpfragment);
                x.callOnClick();
            }
        };
        btnTest.setOnClickListener(cl);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

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

这样做的正确方法是什么?

我这样解决了这个问题:

我将此 function 添加到主要活动中:

public void navigateToHpCalc()
    {
        View view = binding.navView.findViewById(R.id.nav_hpfragment);
        view.callOnClick();
    }

我在片段中这样称呼这个 function :

View.OnClickListener onGoToHpFragmentListener = new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                MainActivity fa = (MainActivity)getActivity();
                fa.navigateToHpCalc();
            }
        };

完整代码:

public class MainActivity extends AppCompatActivity {

    private AppBarConfiguration mAppBarConfiguration;
    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        setSupportActionBar(binding.appBarMain.toolbar);
        binding.appBarMain.fab.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        DrawerLayout drawer = binding.drawerLayout;
        NavigationView navigationView = binding.navView;
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home, R.id.nav_hpfragment, R.id.nav_gallery, R.id.nav_slideshow)
                .setOpenableLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);


    }

    public void navigateToHpCalc()
    {
        View view = binding.navView.findViewById(R.id.nav_hpfragment);
        view.callOnClick();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

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

public class HomeFragment extends Fragment {

    private FragmentHomeBinding binding;

    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        HomeViewModel homeViewModel = new ViewModelProvider(this).get(HomeViewModel.class);

        binding = FragmentHomeBinding.inflate(inflater, container, false);
        View root = binding.getRoot();

        final TextView textView = binding.textHome;
        final Button btn = binding.btnGotoDensityAlt;

        homeViewModel.getText().observe(getViewLifecycleOwner(), textView::setText);


        View.OnClickListener onGoToHpFragmentListener = new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                MainActivity fa = (MainActivity)getActivity();
                fa.navigateToHpCalc();
            }
        };

        View.OnClickListener onGoToGallery = new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Navigation.findNavController(root).navigate(R.id.action_nav_home_to_nav_gallery);
            }
        };
        binding.btnGotoDensityAlt.setOnClickListener(onGoToHpFragmentListener);
        binding.btnGoToGallery.setOnClickListener(onGoToGallery);


        return root;
    }





    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }
}

我仍然不确定这是最好的做法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM