从子片段访问父片段方法

Posted

技术标签:

【中文标题】从子片段访问父片段方法【英文标题】:Access Parent Fragment method from Child Fragment 【发布时间】:2018-03-20 00:37:18 【问题描述】:

我正在尝试从Map 片段访问位于父片段Tabs 中的myfunction()

我尝试了以下行 Tabs parentFragment = (Tabs) getParentFragment(); 但是 parentFragment 为空。

我阅读了有关该主题的所有主题,但没有一个对我有帮助...(可能是我误解了它们之后)。

我有以下文件:

我要从中调用 Parent 方法的 Fragment。

public class Map extends Fragment 

View rootView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 

    rootView = inflater.inflate(R.layout.map_fragment, container, false);
    Tabs parentFragment = (Tabs) getParentFragment();
    parentFragment.myfunction();
    // it crash because parentFragment is null...
    return rootView;
    


包含 myfunction() 方法的父片段。

public class Tabs extends Fragment 
private View rootview;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup 
container, @Nullable Bundle savedInstanceState) 
    super.onCreateView(inflater, container, savedInstanceState);
    rootview = inflater.inflate(R.layout.tabs, container, false);

    TabLayout tabLayout = (TabLayout) rootview.findViewById(R.id.tab_layout);
    tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
    tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
    tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

    final ViewPager viewPager = (ViewPager) rootview.findViewById(R.id.pager);
    Context context = (HomeContainer)getContext();
    final TabsAdapter adapter = new TabsAdapter
            (getActivity().getSupportFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(adapter);
    viewPager.setOffscreenPageLimit(3);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() 
        @Override
        public void onTabSelected(TabLayout.Tab tab) 
            viewPager.setCurrentItem(tab.getPosition());
        

        @Override
        public void onTabUnselected(TabLayout.Tab tab) 

        

        @Override
        public void onTabReselected(TabLayout.Tab tab) 

        
    );
    return rootview;


// the function I desire to call
public void myfunction()




TabsAdapter(因为Map 片段是一个标签)。

public class TabsAdapter extends FragmentStatePagerAdapter 
int mNumOfTabs;

public TabsAdapter(FragmentManager fm, int NumOfTabs) 
    super(fm);
    this.mNumOfTabs = NumOfTabs;


@Override
public Fragment getItem(int position) 

    switch (position) 
        case 0:
            Map tab1 = new Map();
            return tab1;
        case 1:
            Settings tab2 = new Settings();
            return tab2;
        case 2:
            Others tab3 = new Others();
            return tab3;
        default:
            return null;
    


@Override
public int getCount() 
    return mNumOfTabs;


我对 android 比较陌生,所以我有点迷茫! 提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

onCreateView 可能为时过早,请尝试这样做onViewCreated,或者在最坏的情况下使用onStart

【讨论】:

还将 getSupportFragmentManager 替换为 getChildFragmentManager。这是这里的主要问题。【参考方案2】:

我建议您将 is 放在 onCreateView 之后并检查实例。

 Fragment parentFragment = getParentFragment();

    if(parentFragment instanceof Tab) 
        ((Tab) parentFragment).myfunction();
     

【讨论】:

我试过了,不幸的是还是一无所获。 parentFragment 仍然是 null,因此 myfunction() 没有被执行。

以上是关于从子片段访问父片段方法的主要内容,如果未能解决你的问题,请参考以下文章

从片段访问父活动的数据

从 Viewpager2 片段访问父片段函数

跨域访问方法介绍--使用片段识别符传值

访问片段的子视图时出现空指针异常

从父片段调用方法

根据父活动在片段中调用不同的方法