如何在android中创建时通过底部导航的id访问查找视图

How can i access the find view by id of bottom nav outside on create in android

提问人:Vivek M Fauzdar 提问时间:8/12/2022 最后编辑:Vivek M Fauzdar 更新时间:8/12/2022 访问量:547

问:

我正在开发一个应用程序,我在主页上使用底部导航,其中我在第二个片段上有三个片段,称为发布广告我有一个名为输入片段区域的按钮,现在当我进入另一个片段时,我现在进入另一个片段,现在我不想在那里显示底部导航,所以要隐藏它,我正在我的主要活动中使用一个名为“setBottomNavigationVisibility”的方法我正在编写代码来设置底部导航的可见性。 但问题是它在 mainactivty 的方法中抛出空指针异常,说

“void com.google.android.material.bottomnavigation.BottomNavigationView.setVisibility(int)' on a null object reference”在我设置可见性的方法行上

MainActivity 代码

public class MainActivity extends AppCompatActivity {

NavController navController;
BottomNavigationView bottomNavigationView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    navController = Navigation.findNavController(this, R.id.fragmentContainerView);
    bottomNavigationView = findViewById(R.id.activity_main_bottom_navigation_view);
    NavigationUI.setupWithNavController(bottomNavigationView, navController);

}

public void setBottomNavigationVisibility(int visibility) {

    bottomNavigationView.setVisibility(visibility);

}}

在上述方法中,当我尝试在bottomNavigationView.setVisibility(visibility)行上设置可见性时;这就是它通过异常的地方

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    binding = FragmentSecondBinding.inflate(inflater, container, false);

    // Inflate the layout for this fragment
    View view =  binding.getRoot();

    viewModel = new ViewModelProvider(requireActivity()).get(PageViewModel.class);

    ((MainActivity) requireActivity()).setBottomNavigationVisibility(View.GONE);

    binding.toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           Navigation.findNavController(view).navigate(R.id.action_secondFragment2_to_postad);
        }
    });

不,请指导我如何解决此错误。

java android-fragments nullpointerexception

评论

0赞 ADM 8/12/2022
你怎么打电话?添加代码 。请从问题中删除所有这些图像,它们与问题无关。setBottomNavigationVisibility
0赞 Vivek M Fauzdar 8/12/2022
请在我调用的片段的 oncreateview 内部检查 ((MainActivity) requireActivity()).setBottomNavigationVisibility(View.GONE);
0赞 ADM 8/12/2022
这里没有加起来,因为似乎是空的。您确定这是您唯一拨打的电话吗?你不是在某个地方打电话,对吧?bottomNavigationViewsetBottomNavigationVisibilitynew MainActivity()
0赞 Vivek M Fauzdar 8/12/2022
是的,这是我在这里打的唯一电话

答:

0赞 ninhnau19 8/12/2022 #1

在片段中,您想要隐藏底部栏,只需在 onViewCreated 中调用此行即可

getActivity().findViewById(R.id.activity_main_bottom_navigation_view).setVisibility(View.GONE);

当您离开 fragment 时,请在 onDestroyonStop 中调用以下行,以显示另一个 fragment 的底部导航:

getActivity().findViewById(R.id.activity_main_bottom_navigation_view).setVisibility(View.VISIBLE)

评论

0赞 Vivek M Fauzdar 8/12/2022
嘿,谢谢你的回复,它正在工作,但问题是它不适用于每个片段。不知道为什么??
0赞 Vivek M Fauzdar 8/12/2022
如果它不起作用,应用程序崩溃,抛出空指针异常
0赞 ninhnau19 8/12/2022
getActivity().findViewById 适用于 MainActitivity 中的所有片段,如果您导航到某个片段不在 MainActivity 中,则它不起作用
0赞 Vivek M Fauzdar 8/12/2022
不,我只在我的活动 main 中使用它,但是
0赞 Vivek M Fauzdar 8/12/2022
另外,当我返回主页片段时,我希望底部导航应该显示在那里,但它没有??
0赞 Александр Волошиновский 8/12/2022 #2

做这样的事情,定义接口

interface DashboardActivityDelegate {
    void hideBottomBar();
    void showBottomBar();
}

活动必须实现此接口

在要隐藏底部导航视图的片段中,执行以下操作: 声明全局变量

private DashboardActivityDelegate dashboardActivityDelegate;

@Override
public void onAttach(Context context) {
      super.onAttach(context);
      if (context instanceof DashboardActivityDelegate) {
         dashboardActivityDelegate = (DashboardActivityDelegate)context;
      }

   }

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      if (dashboardActivityDelegate != null) {
         dashboardActivityDelegate.hideBottomBar();
      }
   }

@Override
public void onDestroy() {
      super.onDestroy();
      if (dashboardActivityDelegate != null) {
         dashboardActivityDelegate.showBottomBar();
      }

   }

评论

0赞 Vivek M Fauzdar 8/12/2022
嘿,谢谢你,它正在工作,但问题是当我返回主主页片段时,它没有显示,而它应该显示在那里
0赞 Александр Волошиновский 8/12/2022
返回后未显示底部导航视图?
0赞 Vivek M Fauzdar 8/12/2022
是的,在后按时,它没有显示在主片段上
0赞 Александр Волошиновский 8/12/2022
在函数showBottomBar的活动中,您添加了用于显示底部导航视图的代码?
0赞 Vivek M Fauzdar 8/12/2022
是的,我添加了代码 public void showBottomBar() { bottomNavigationView.setVisibility(View.VISIBLE);