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



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

您无法从活动类访问片段视图,因为活动使用自己的视图(ex: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;
    }

fragment onCreateViewonCreate活动方法之后调用,因此我认为您尝试从中获得访问权限。该视图只有在调用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();
}

片段:

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

如果您是从主动行为动态添加片段的:

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

我为此挣扎了几个小时,我发现了一个更简单的解决方案。

在片段内,只需使用所需的行为来制作公共功能(外部创建视图方法之外)。

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

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

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

最新更新