3

У меня есть ViewPager, используя TabLayout с несколькими фрагментами. Я хотел бы нажать кнопку на одном из фрагментов ViewPager и направить пользователя на другую вкладку/фрагмент, используя имя вкладки.Изменить фрагмент ViewPager из детского фрагмента

Когда кнопка нажата, мне нужно, чтобы TabLayout изменился, а также отобразите фрагмент, связанный с этой вкладкой. Мне также нужно будет отправить дополнительные данные с запросом на новый фрагмент.

У меня нет доступа к ViewPager setCurrentItem (int index). В идеале я хотел бы связаться с родителем, чтобы выполнить запрос.

ответ

3

Вы должны писать Способ родителя (содержащего ViewPager и суб-фрагментов), как так:

public void setPagerFragment(int a) 
{ 
    pager.setCurrentItem(a); 
} 

Это позволит установить текущий фрагмент в ViewPager быть один указано. После этого вы можете вызвать этот метод из дочернего фрагмента с:

int newFrag = 0; //the number of the new Fragment to show 
ParentActivity parent = (ParentActivity) getActivity(); 
parent.setPagerFragment(newFrag); 

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

Например, в родителю:

public void setExtraData(Object data) 
{ 
    dataFromChildFrag = data; 
} 

и использовать это в ребенке так:

String data = "My extra data"; //the number of the new Fragment to show 
ParentActivity parent = (ParentActivity) getActivity(); 
parent.setExtraData(data); 

Наконец, если родитель фактически сам фрагмент, а не активность, просто заменить все ссылки:

ParentActivity parent = (ParentActivity) getActivity(); 

к:

ParentFragment parent = (ParentFragment) getParentFragment(); 

Надеюсь, это поможет!

0

Самый простой способ добиться этого, используя фреймворк EventBus!

Я предпочитаю (Ed), используя EventBus by greenRobot

Как реализовать:

1) Создать класс событий, который удовлетворяет ваши потребности

public class ClickedButtonInsideFragmentEvent { 

    // some data you want to store 

} 

2) Приготовьте ваши абоненты! В вашем случае это будет активность, которая содержит ссылку на вкладку Разметка:

public class MyTabActivity { 

    public void onCreate(Bundle savedInstanceSate) { 
     // your stuff you do in onCreate 
     eventBus.register(this); 
    } 

    @Subscribe 
    public void onEvent(ClickedButtonInsideFragmentEvent event) { 
     // Do what you want to do 
    } 

} 

3) и, наконец: опубликовать событие из вашего OnClickListener инсайдера ваш фрагмент:

public class MyClickableFragment { 

    public void initOnClickListiner(View clickableView) { 
     clickableView.setOnClickListener(new OnClickListener() { 
      public void onClick(View view) { 
       ClickedButtonInsideFragmentEvent event = new ClickedButtonInsideFragmentEvent(); 
       // add what you want to your event 
       eventBus.post(event);     
      } 
     )); 
    } 

    @Subscribe 
    public void onEvent(ClickedButtonInsideFragmentEvent event) { 
     // Do what you want to do 
    } 

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