[英]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.