2016-07-11 7 views
0

Я создал два ViewPagers в своей деятельности, и то, что я пытаюсь сделать, - это обмен одними и теми же данными между ними.Обмен данными между просмотрщиками

ViewPager 1 показывает фрагмент для каждой строки в списке с именем «A». Каждый фрагмент имеет простой макет с TextView.

ViewPager 2 показывает фрагмент для каждой строки из того же списка «A». Каждый фрагмент имеет простой макет с EditText.

Я пытаюсь получить такое поведение:

1) VP 1 виден, и пользователь может проведите каждый фрагмент заселен со строками из списка «А».

2) VP 2 является невидимым.

3) После события onClick в TextView я хотел бы скрыть VP 1 и показать VP 2 с тем же строковым содержимым, но в EditText вместо TextView.

4) Пользователь может изменить содержимое EditText.

5) После 4) пользователь может нажать кнопку на панели инструментов и вернуться к VP 1 с обновленным контентом.

Я использую FragmentStatePagerAdapter.

Я думал сохранить данные непосредственно в БД или в файле.

Возможно ли создать что-то подобное? Как я могу реализовать событие, которое после нажатия на фрагмент «n» в VP1 достигает фрагмента «n» в VP2? Как обновить содержимое в VP 1 после мода в VP 2?

Код на данный момент довольно прост, поэтому я не размещал его здесь, кстати очень похож на this one.

Благодаря

ответ

0

Почему вы не просто использовать один ViewPager, с фрагментом, имеющий TextView и EditText. Для видимости EditText установлено значение «GONE». По щелчку TextView установите видимость на «GONE», а EditText - на «VISIBLE». Когда нажата кнопка панели инструментов, сделайте противоположное, а также добавьте новый текст к соответствующему TextView.

+0

Спасибо за Ваш ответ Дрилон, я попробую свое решение это очень просто, но, наверное, самое лучшее. Я дам Вам знать. – michoprogrammer

+0

okay cool ^^ поймать меня, если у вас возникли проблемы –

0

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

ViewPagerComm.Класс:

public interface ViewPagerComm { 
String getData(); 
void setData(String data); 
} 

активность:

public class FragmentStatePagerSupport extends Activity, implements  ViewPagerComm { 

String data; 
... 

@Override 
public void setData(String data){ 
this.data = data; 
} 

@Override 
public String getData(){ 
return data; 
} 

} 

... 
} 

В адаптере:

public static class MyAdapter extends FragmentStatePagerAdapter { 
    ViewPagerComm callback; 
    public MyAdapter(FragmentManager fm, ViewPagerComm callback) { 
     this.callback = callback; 
     super(fm); 
    } 

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

    @Override 
    public Fragment getItem(int position) { 
     return ArrayListFragment.newInstance(position, callback); 
    } 
} 

В ваших фрагментах:

public static class ArrayListFragment extends ListFragment { 
    ViewPagerComm callback; 

    static ArrayListFragment newInstance(int num, ViewPagerComm callback) { 
     ArrayListFragment f = new ArrayListFragment(); 
     f.callback = callback; 
     // Supply num input as an argument. 
     Bundle args = new Bundle(); 
     args.putInt("num", num); 
     f.setArguments(args); 

     return f; 
    } 

} 

Теперь, когда фрагмент вызывает УстановитьДанные (aString) родительская активность будет содержать данные. Всякий раз, когда фрагмент вызывает getData(), данные будут извлекаться из активности.

+0

Вместо использования интерфейса я использую EventBus, но я думаю, что это не главное. У меня нет никакой проблемы для связи между Fragment/Activity в VP1 или VP2, проблема в том, что я понятия не имею, как переключиться с фрагмента N в VP1 на фрагмент N в VP2. – michoprogrammer

+0

ok, eventbus - это хорошо. Я не совсем понимаю вашу проблему. Если вы хотите установить связь между двумя ViewPagers, затем отправьте событие на шину с помощью одного и реализуйте его в действии, чтобы установить второй. – SoroushA

0

Просто объявить переменную в вашей деятельности (ваш ViewPager активность)

public class TestActivity extends AppCompatActivity { 
    public String test; 
} 

И доступ к нему в вашем фрагменте (в коде)

((TestActivity)getActivity()).test 
+0

Спасибо за ваш ответ Саймон, но я не понимаю вашего решения. Не могли бы вы дать лучшее объяснение? – michoprogrammer

+0

У вас есть ваша деятельность, но в этом случае это TestActivity. После открытия скобки {вы можете объявлять переменные в классе. Переменная доступна из других классов, установив ее общедоступной. Теперь в ваших фрагментах вы можете получить доступ к этой переменной с помощью ((TestActivity) getActivity()). VARIABLE Просто перейдите к фрагменту, где текст отредактирован, и установите String обычно ((TestActivity) getActivity()). Test = "ABC " Затем перейдите к фрагменту, где должен отображаться текст, а затем получить к нему доступ: ((TestActivity) getActivity()). Test – Simon

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