2015-05-26 2 views
0

Я знаю, что если вы хотите общаться между фрагментами, вы должны сделать это через родительскую активность. Это имеет смысл, когда два фрагмента находятся на одном уровне. Если кто-то вложен во второй, не имеет смысла «подниматься» только для возврата «вниз».Android, взаимодействующий между вложенными фрагментами

В этом случае картина имеет смысл:

Activity 
    ____|____ 
/  \ 
Frag A Frag B 

Это не имеет большого смысла использовать шаблон, когда один вложен в другой:

Activity 
     | 
    Frag A 
     | 
    Frag B 

Допустимо общаться непосредственно с помощью findFragmentByTag (FRAG_X_TAG), если один вложен в другой?

ответ

0

Идея этой модели заключается в использовании Activity в качестве интерфейса Controller, к которому Fragment s является View s - они посылают события пользовательского интерфейса к Controller, которые, в свою очередь, обновляют их по мере необходимости.

Это означает, что реальный вопрос здесь должен быть «Является ли Frag A a Controller для Frag B» - если это так, то будет возможна прямая связь. Если оба являются просто «глупыми взглядами», они действительно не должны знать друг о друге.

Суть в том, что вы хотите избежать создания кода спагетти, что возможно, если вы обеспечиваете разделение проблем.

+0

Если я правильно понял, то вы говорите, что это не должно вызывать никаких проблем, но это плохая практика? – JY2k

+1

Я говорю, что в зависимости от контекста это может быть плохой практикой - если Frag A удерживает все состояние данных, необходимое для правильного отображения Frag B, то это де-факто контроллер для Frag B, и это не будет плохая практика. Если состояние для Frag A и Frag B удерживается в Activity, лучше разрешить Activity управлять обоими из них, а не позволять Frag A управлять Frag B. – npace

0

Согласно API 4.2 documentation, вы должны использовать getChildFragmentManager()

Вы всегда можете использовать библиотеку BusEvent, это облегчает обмен данными между компонентами, но вы также можете потерять код разборчивость.

0

Похоже, что вы можете использовать Event Bus. Вот некоторые из наиболее популярных вариантов:

+0

Я знаю об этом варианте, но не хочу зависимости только для этого варианта использования. – JY2k

-1

Если вы хотите activte Morethan 1 фрагмент в то же время ... потом использовать метод getChildFragmentManager()

например:

Я главный фрагмент под названием «ShareSpace» и имеет 3 ч ИСД фрагмент .. // В ShareSpace Фрагмент

View view = inflater.inflate(R.layout.fragment_sharespace, container, false); 
    mTabletSize = getResources().getBoolean(R.bool.isTablet); 
    mContext=getActivity(); 
    ViewPager pager = (ViewPager) view.findViewById(R.id.pager); 

     ShareSpaceAdapter pagerAdapter = new ShareSpaceAdapter(mContext,getChildFragmentManager()); 
     pager.setAdapter(pagerAdapter); 
     mSlidingTabLayout = (SlidingTabLayout) view.findViewById(R.id.sliding_tabs_share); 
     mSlidingTabLayout.setViewPager(pager); 

// В адаптере

public ShareSpaceAdapter(Context mContext, FragmentManager fm) { 
    super(fm); 
    this.mContext = mContext; 
    // TODO Auto-generated constructor stub 
    try { 
     if (home == null) { 
      homeFact = FactoryGenerator.getFactory(Constants.HOME); 
      home = homeFact.getHomeManagement(Constants.SHARESPACE); 
     } 
     local = home.readAssets(mContext); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public Fragment getItem(int arg0) { 
    Fragment frgmt = null; 

    switch (arg0) { 
    case 0: 

     frgmt = new ShareSpaceFiles(mContext); 
     break; 
    case 1: 

     frgmt=new ShareSpaceFolder(mContext); 
     break; 
    case 2: 

     frgmt = new ShareSpaceInbox(mContext); 
     break; 

    default: 
     break; 
    } 

    return frgmt; 
} 

@Override 
public int getCount() { 
    return PAGE_COUNT; 
} 

@Override 
public CharSequence getPageTitle(int position) { 

    switch (position) { 
    case 0: // Fragment # 0 - This will show FirstFragment 
     return local.getmFiles();//"FILES"; 
    case 1: // Fragment # 0 - This will show FirstFragment different title 
     return local.getmFolders();//"FOLDERS"; 
    case 2: 
     return local.getmMessages();//"MESSAGES"; 

    default: 
     return null; 

    } 

} 

Это загрузит 3 фрагмента ребенка одновременно

+0

Я хочу общаться между ними. не уверен, что вы правильно поняли мой вопрос. – JY2k

Смежные вопросы