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

时间:2016-12-26 12:13:57

标签: android nullpointerexception fragment

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

5 个答案:

答案 0 :(得分:0)

您无法从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;
    }

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果您从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 :(得分:0)

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

在片段内部,只需创建一个具有所需行为的公共函数(在 on create 视图方法之外)。

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

然后在主活动中访问片段并调用函数。

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

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

答案 4 :(得分:-1)

虽然不推荐,但您可以通过以下方式实现您的目标:

将您的观点声明为片段中的static字段。片段经过onCreateViewonActivityCreated后,设置要从主要活动(findViewById()等)访问的静态视图的值。然后,您可以联系Main Activity中的静态视图。 BTW每当你想从主活动调用静态视图上的方法时,检查它是否为空。