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

Posted

技术标签:

【中文标题】如何访问 MainActivity() 中的片段元素?【英文标题】:how to access fragments elements in 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);

【问题讨论】:

【参考方案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;
    

【讨论】:

以上是关于如何访问 MainActivity() 中的片段元素?的主要内容,如果未能解决你的问题,请参考以下文章

在活动中访问片段?

如何从 MainActivity 中的 Fragment 访问适配器?我正在使用带有 viewpager 的标签,所以没有交易等方法

如何在主活动中正确检索片段中的视图

如何将片段活动添加到 MainActivity.java 或 MainActivity.kt

从另一个 Activity 返回后返回 MainActivity 的片段?

如何在不与 MainActivity 交互的情况下从通知中打开片段页面?