2013-12-20 4 views
1

Я следил за видео на slidenerd, чтобы создать салфетки с помощью фрагментов. я в основном реализован pagerAdapter:Как установить идентификатор фрагмента при использовании вкладок салфетки и ViewPager?

class pagerAdapter extends FragmentStatePagerAdapter 
{ 

    public pagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int arg0) { 
     Fragment fragment = null; 
     if (arg0 == 0) 
      fragment = new fragmentA(); 
     if (arg0 == 1) 
      fragment = new fragmentB(); 
     if (arg0 == 2) 
      fragment = new fragmentC(); 
     if (arg0 == 3) 
      fragment = new fragmentD(); 
     return fragment; 
    } 

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

} 

И это прекрасно работает до сих пор. Теперь я хочу иметь возможность отправлять информацию из одного фрагмента в другой поток активности. То, что я сделал, это создать интерфейс коммуникатора, который реализуется как для действия, так и для фрагментов.

public interface Communicator { 
    public void Send(int from, int to, Object object); 
    public void Receive(int id, Object object); 
} 

Если Fragmenta хочет отправить fragmentB сообщение, я просто использовать Send(a's id, b's id, someData) деятельность обрабатывает сообщение и использует fragmentManager, чтобы доставить сообщение Ъ:

public void Send(int from, int to, Object object) { 
    FragmentManager fm = getSupportFragmentManager(); 
    Communicator comm = (Communicator) fm.findFragmentById(...); 
    if (comm != null) 
     comm.Receive(from, object); 
} 

Это именно там, где Im застрял. Мне нужно получить указатель на мой фрагмент, но не знаю, как дать ему идентификатор. ViewPager меня немного сбивает с толку.

+0

ФрагментStatePagerAdapter может отключать фрагменты, когда это необходимо, и поэтому недоступно для отправки сообщений. – Kuffs

+0

@ Kuffs благодарит за замедление. Вы имеете в виду также объект java или просто как представление? – buddy123

+0

Если нужно, он отключит фрагмент, пока он не понадобится снова, и в этом случае он снова запустит его. Если вам нужны ваши фрагменты, чтобы существовать до тех пор, пока вы не решите избавиться от них, вам понадобится FragmentPagerAdapter. – Kuffs

ответ

2

Вы можете получить ссылку на фрагмент из адаптеров-я:

public void Send(int from, int to, Object object) { 

    Communicator comm = pagerAdapter.getItem(to); 
    if (comm != null) 
     comm.Receive(from, object); 
} 

Вот и из должен быть индексом фрагментов внутри адаптера.

+0

Я вижу. Благодарю. Но я не уверен, что его 100% хорошо для меня, поскольку один из фрагментов заменяется во время активности пользователя. i.e tab0 - это фрагмент поиска, в котором операция поиска заменяет фрагмент в tab0 на фрагмент результатов, а затем я хочу отправить сообщение из фрагмента поиска в фрагмент результатов. Я не могу использовать pagerAdapter, поскольку он отправит сообщение самому себе – buddy123

+0

, вы можете просто сохранить ссылку на результат и искать фрагменты при замене и просто вызвать отправку на объект поиска –

+0

Нет ли другого способа получить указатель/набор идентификаторов фрагмент фрагментам, отличным от viewPager? – buddy123

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