从子片段访问父片段方法

问题描述:

我试图从Map片段访问myfunction()片段Tabs中的位置。从子片段访问父片段方法

我试过以下行Tabs parentFragment = (Tabs) getParentFragment();但是parentFragment为null。

我阅读了有关这个主题的所有主题,但没有人帮助我......(也许我误解了他们之后)。

我有以下文件:

片段从中我要调用父类的方法。

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,所以我有点失落! 在此先感谢您的帮助。

onCreateView可能为时过早,在最坏的情况下尝试这样做onViewCreatedonStart

+0

我刚刚尝试过,仍然是同样的错误... – Bobo159951

+1

也用getChildFragmentManager替换getSupportFragmentManager。这是这里的主要问题。 – natario

+0

你是我的英雄!非常感谢! – Bobo159951

我建议你把是在onCreateView之后,并检查实例。

Fragment parentFragment = getParentFragment(); 

    if(parentFragment instanceof Tab) { 
     ((Tab) parentFragment).myfunction(); 
    } 
+1

我尝试过,但很不幸仍然没有。 'parentFragment'仍然是'null',因此'myfunction()'不会被执行。 – Bobo159951