Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何访问MainActivity()中的片段元素?_Android_Nullpointerexception_Fragment - Fatal编程技术网

Android 如何访问MainActivity()中的片段元素?

Android 如何访问MainActivity()中的片段元素?,android,nullpointerexception,fragment,Android,Nullpointerexception,Fragment,在我的项目中,我想从MainActivity设置片段按钮的可见性。但问题是,它会产生NullPointerException。我还将listBtn和gridBtn设置为静态。我使用了以下代码: FirstFragment fragment = (FirstFragment)getSupportFragmentManager().findFragmentById(R.id. <frameLayout Id>); main_page_fragment.listBtn.set

在我的项目中,我想从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);

您无法从Activity类访问片段视图,因为Activity使用自己的视图ex:R.layout.Activity\u 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;
    }

虽然不建议您这样做,但您可以通过以下方式实现您的目标:

在片段中将视图声明为静态字段。在片段完成onCreateView和onActivityCreated之后,设置要从主活动findViewById等访问的静态视图的值。然后可以从主活动联系静态视图。 顺便说一句,每当您想从主活动调用静态视图上的方法时,请检查它是否为null。

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

另一个技巧是,您不应该像以前那样直接调用片段视图,也不应该通过静态引用来调用片段视图。您应该避免这种对内部实现的依赖。与其这样,不如创建一些方法,比如setInitialState。名称取决于您的业务逻辑,只需从活动中调用它即可

因此,结果代码: 在活动中:

private FirstFragment fragment;

protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //init fragment here
}

@Override
protected void onResumeFragments() {
    super.onResumeFragments();
    fragment.setInitialState();
}
fragment.hideButtons();
片段:

//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);
}

如果从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);
}
并从活动中调用它:

private FirstFragment fragment;

protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //init fragment here
}

@Override
protected void onResumeFragments() {
    super.onResumeFragments();
    fragment.setInitialState();
}
fragment.hideButtons();

我挣扎了几个小时,找到了一个更简单的解决方案

在片段内部,只需在on create view方法外部创建一个具有所需行为的公共函数

fun hideElement() {
    binding.button.visibility = View.GONE
}
然后在主活动中访问片段并调用函数

binding.bottomNavigation.setOnNavigationItemSelectedListener {
when (it.itemId){

      R.id.someFragment -> someFragment.hideElement()
           
        }
    }

请不要张贴这样的答案。这真的很糟糕,我们应该帮助以正确的方式做事,避免提及痛苦的方法。我认为了解和学习完成任务的坏方法,实际上是一件好事。您可以在不使用它们的情况下了解它们。正如你所看到的,我在答案的顶部清楚地说明了不推荐。