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

问题描述:

在我的项目中,我想要设置MainActivity中片段按钮的可见性。但问题是,它给了NullPointerException()。我还将listBtn & gridBtn视为静态。我用下面的代码:如何访问MainActivity()中的片段元素?

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

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

因为活动均使用其自己的观点(:R.layout.activity_main EX)不能从Activity类访问您的片段视图。相反,您可以在相应的片段类中设置可见性,从而完成相同的工作。

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

虽然不建议这样做,你可以达到你想要的东西做这个:

声明你的意见,在该片段中static领域。在片段经过其onCreateViewonActivityCreated后,设置要从主活动(findViewById()等)访问的静态视图的值。然后,您可以联系主活动中的静态视图。 顺便说一句,只要你想在主要活动的静态视图上调用一个方法,检查它是否为空。

+0

请不要张贴这样的答案。这真的很糟糕,我们应该帮助以正确的方式做事,避免引用任何痛苦的方法。 – Beloo

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

如果从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();