Связь между вкладками 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);
}
}
Наконец в вашем Fragment
s вы можете получить хостинг Activity
с getActivity()
и для использования методов связи просто приведите активность в реализованный интерфейс связи, например, так:
((FragmentCommunication) getActivity()).printMessage("Hello from Fragment!");
РЕДАКТИРОВАТЬ: для дальнейшей передачи сообщения другим Fragment
s сделать это: так как все ваши вкладки расширяются 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