Связь между вкладками SlidingTabLayout

Я много искал, как общаться между фрагментами, используя SlidingTabLayout, но на самом деле не получил хорошего ответа. Я знаю, как использовать ActionBar, но я хотел новый способ для леденцов на палочке Android с использованием SlidingTabLayout. Я пробовал это-> http://android-er.blogspot.in/2012/06/communication-between-fragments-in.html но я хотел дизайн материала. Я ссылался на эту ссылку http://www.android4devs.com/2015/01/how-to-make-material-design-sliding-tabs.html для создания скользящих вкладок дизайна материала. Теперь я хотел знать, как общаться между скользящими вкладками. Я много пробовал, но не смог найти ответ, который искал. Любая помощь была бы очень признательна.

3 ответа

Решение

Самый чистый способ - определить интерфейс, Activity который содержит Fragmentс будет реализовывать. Вот как я недавно решил это:

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

public interface FragmentCommunication
{
    public void printMessage(String message);
    //....    
}

В вашем Activity вам нужно реализовать этот интерфейс

public class MainActivity extends ActionBarActivity implements FragmentCommunication
{   
    //....
    public void printMessage(String message)
    {
        System.out.println(message);
    }
}

Наконец в вашем Fragments вы можете получить хостинг Activity с getActivity() и для использования методов связи просто приведите активность в реализованный интерфейс связи, например, так:

((FragmentCommunication) getActivity()).printMessage("Hello from Fragment!");

РЕДАКТИРОВАТЬ: для дальнейшей передачи сообщения другим Fragments сделать это: так как все ваши вкладки расширяются Fragment лучше создать еще один интерфейс

public Interface ReceiverInterface
{
    public void receiveMessage(String str);
}

Затем внедрите это в свои вкладки

public class Tab1 extends Fragment implements ReceiverInterface
{
   // .... code .....
    public void receiveString(String str)
    {
        //use str
    }
}

Для дальнейшей отправки этого сообщения другим фрагментам требуется, чтобы активность их увидела. Например, теперь измените printMessage() тот Activity реализует это

    public void printMessage(String message)
    {
        System.out.println(message);
        //Send the message that came from one fragment to another
        if (tabFragment1 instanceof ReceiverInterface){
            ((ReceiverInterface) tabFragment1).receiveMessage(message);
        }
    } 

Когда вы скользите вкладки (ViewPager), вы можете работать с тем же Fragment или использовать разные Fragments,

Как вы уже упоминали, вы пробовали это, поэтому я иду с разными Fragments,

То, что вы собираетесь сделать, это в основном использовать EventBus: https://github.com/greenrobot/EventBus.

Добавьте его в свой build.gradle зависимости, расположенные внутри app папка.

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile 'de.greenrobot:eventbus:2.4.0'   
}

Вы также можете достичь этого, используя Intents,

1 - Создайте класс для представления события при изменении вашего текста:

public class TextChangedEvent {
  public String newText;
  public TextChangedEvent(String newText) {
      this.newText = newText;
  }
}

2 - Фрагмент А:

//when text changes
EventBus bus = EventBus.getDefault();
bus.post(new TextChangedEvent(newText));    

3 - Фрагмент Б:

EventBus bus = EventBus.getDefault();

//Register to EventBus
@Override
public void onCreate(SavedInstanceState savedState) {
 bus.register(this);
}

//catch Event from fragment A
public void onEvent(TextChangedEvent event) {
 yourTextView.setText(event.newText);
}

Источник: /questions/16648449/svyaz-mezhdu-fragmentami-v-viewpager/16648461#16648461

Используйте библиотеку EventBus GitHub. На данный момент это самый простой и удобный способ. https://github.com/greenrobot/EventBus

Другие вопросы по тегам