【问题标题】:how to access fragments elements in MainActivity()?如何访问 MainActivity() 中的片段元素?
【发布时间】:2017-05-10 21:51:04
【问题描述】:

在我的项目中,我想从 MainActivity 设置片段按钮的可见性。但问题是,它给出了 NullPointerException()。我还将 listBtn 和 gridBtn 设为静态。我使用了以下代码:

 FirstFragment fragment = (FirstFragment)getSupportFragmentManager().findFragmentById(R.id.    <frameLayout Id>);

  main_page_fragment.listBtn.setVisibility(View.GONE);
  main_page_fragment.gridBtn.setVisibility(View.GONE);

【问题讨论】:

    标签: android nullpointerexception fragment


    【解决方案1】:

    我为此苦苦挣扎了几个小时,然后找到了一个更简单的解决方案。

    在片段内部,只需使用您想要的行为创建一个公共函数(在 on create 视图方法之外)。

    fun hideElement() {
        binding.button.visibility = View.GONE
    }
    

    然后在主activity中访问fragment并调用函数。

    binding.bottomNavigation.setOnNavigationItemSelectedListener {
    when (it.itemId){
    
          R.id.someFragment -> someFragment.hideElement()
               
            }
        }
    

    【讨论】:

      【解决方案2】:

      如果您像这样从 MainActivity 动态添加片段:

      YourFragment fragment = new YourFragment();
          FragmentManager fragmentManager = getSupportFragmentManager();
          fragmentManager.beginTransaction()
                  .replace(R.id.fragmentContainer, fragment, YOUR_TAG)
                  .commit();
      

      然后您可以像这样在片段中定义方法:

      public void hideButtons()
      {
          yourBtn.setVisibility(View.GONE);
      }
      

      并从活动中调用它:

      fragment.hideButtons();
      

      【讨论】:

        【解决方案3】:

        片段onCreateView 回调在onCreate 活动方法之后调用,所以我认为您已尝试从中获取访问权限。只有在调用 onResumeFragments 回调后才能访问该视图,您应该在此处使用片段执行您的操作。

        另一个提示是,您强烈不应该像以前那样直接或通过静态引用视图(即the worst)调用片段视图。您应该避免对片段内部实现的这种依赖。而不是它,更好的是创建一些方法,如setInitialState(名称取决于您的业务逻辑)并从活动中调用它。

        所以结果代码: 活动中:

        private FirstFragment fragment;
        
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //init fragment here
        }
        
        @Override
        protected void onResumeFragments() {
            super.onResumeFragments();
            fragment.setInitialState();
        }
        

        在片段中:

        //this will be called on fragment #onResume step, so views will be ready here.
        public void setInitialState() {
           listBtn.setVisibility(View.GONE);
           gridBtn.setVisibility(View.GONE);
        }
        

        【讨论】:

          【解决方案4】:

          您无法从 Activity 类访问片段视图,因为 Activity 使用自己的视图(例如:R.layout.activity_main)。相反,您可以在相应的片段类中设置可见性,这将完成相同的工作。

          public View onCreateView(LayoutInflater inflater, ViewGroup container,
                      Bundle savedInstanceState) {
                  View view = inflater.inflate(R.layout.details, container, false);
                  Button listBtn = (Button)view.findviewById(R.id.listBrn);
                  Button gridBtn = (Button)view.findviewById(R.id.gridBrn);
                  listBtn.setVisibility(View.GONE);
                  gridBtn.setVisibility(View.GONE);
                  return view;
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多