2012-06-21 4 views
3

У меня есть эта структура:Передача данных или поведение между действиями и фрагментами

Деятельность A имеет ViewPager. Страницы ViewPager известны как фрагменты.

Деятельность A имеет список сложных объектов, которые я хочу отобразить на страницах.

Когда пользователь нажимает на элемент внутри ViewPager, необходимо запустить B. Упражнение B также нуждается в списке со сложными объектами.

Так что я должен передать этот список

А -> Фрагмент (ы) -> B

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

Но я не хочу, чтобы сериализации или разбазаривать весь список сложных данных только в 2 раза, чтобы получить его до B.

I хотелось бы избежать использования статических полей.

Затем я пришел к идее передать слушателю фрагмент, который прослушивает щелчок элемента и уведомляет о моей активности. А и действие А затем запускает активность Б с данными. Это выглядит очень чисто для меня, потому что A на самом деле тот, к которому принадлежат данные, поэтому A начинает фрагмент с данными, фрагмент возвращается к A, а затем A запускает B с данными. Мне не нужно передавать данные везде (сериализация!).

Но это не работает, потому что, как передать слушателю фрагмент с использованием сериализации? Что не так, если вы используете прослушиватель в фрагменте, чтобы вернуться к активности?

Как это решить?

Редактировать

Я нашел это решение в теме про диалоговых фрагментов: Get data back from a fragment dialog - best practices?

@Override 
public void onAttach(Activity activity) { 
super.onAttach(activity); 
try { 
    mListener = (OnArticleSelectedListener) activity; 
} catch (ClassCastException e) { 
    throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener"); 
} 
} 

Так я добавляю это мой фрагмент и сделать свою деятельность реализовывать определенный интерфейс.

Это решит проблему передачи данных из фрагментов в B. Но мне все равно нужно передать список из A в фрагменты. Возможно, мне придется использовать Parcelable ...

Edit: Я пытался Parcelable, это работает. Но у объектов в моем списке есть много полей между ними, например, карты. Написание кода Parcelable (запись/чтение) является болью. Возможно, я просто придерживаюсь статических данных ...

+0

У меня такая же проблема. Мои сложные данные вычисляются и отображаются в списке активности A с использованием фрагмента, но детали будут отображаться как в активности B с использованием фрагмента, так и в двух панелях в одной и той же деятельности, но с разным фрагментом детали. У меня нет абсолютно никакой идеи, кроме как предоставить подробные данные, которые являются болью ... Вы придумали лучшие идеи? Например, положите его в объект приложения как промежуточную среду? – Zordid

ответ

2

Решение для прослушивателя, которое вы нашли, отлично и фактически рекомендовано Google (http://developer.android.com/training/basics/fragments/communicating.html).

Что касается вашей оставшейся проблемы передачи данных в фрагменты, уверены ли вы, что вам нужен весь список, а не только элемент списка для каждого фрагмента в ViewPager?Если вам просто нужен элемент, вы можете сделать что-то вроде этого:

/* 
    * An adapter for swiping through the fragments we have. 
    */ 
    private class CustomPagerAdapter extends FragmentStatePagerAdapter { 

     List<Thing> things; 

     public CustomPagerAdapter(FragmentManager fragmentManager, List<Thing> things) { 
      super(fragmentManager); 
      this.things = things; 
     } 

     @Override 
     public int getCount() { 
      return things.size(); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return ThingFragment.newInstance(things.get(position)); 
     } 
    } 

    /* 
    * Loads a view based on the thing. 
    */ 
    private static class ThingFragment extends Fragment { 

     private String name; 

     static ThingFragment newInstance(Thing thing) { 

      ThingFragment f = new ThingFragment(); 

      // add some arguments to our fragment for onCreateView 
      Bundle args = new Bundle(); 
      args.putString("name", thing.getName()); 
      f.setArguments(args); 

      return f; 
     } 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      name = getArguments().getString("name"); 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

      View v = inflater.inflate(R.layout.thing_fragment_layout, container, false); 
        TextView t = (TextView)v.findViewById(R.id.thingText); 
      t.setText(name); 
      return v; 
     } 
    } 

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

Если вам действительно нужно передать весь список, да, вам, возможно, придется сделать отдельный сложный объект Parcelable, а затем добавить его в свои аргументы фрагмента, как с Bundle.putParcelableArray().

+0

Спасибо за ваш ответ. В каждом фрагменте я показываю сетку, и я хочу передать список элементов модели для сетки. Я опробовал Parcelable, но реализация ужасна (у моего типа данных есть много полей, а также тип карты и т. Д., Написать код для сериализации и десериализации - это настоящая боль). И это также очень медленно, мой экран пуст. Поэтому я предполагаю, что мне придется использовать статические данные. – Ixx

+0

Ух, извините, экран пуст, потому что что-то еще, а не просто. – Ixx

+1

Я полагаю, что если вы уверены в своих условиях, вы можете получить информацию в onAttach через листинг: '@Override public void onAttach (Activity activity) { super.onAttach (activity); Активность mFragmentList = ((MyActivity)) .getList(); } ' – Makario

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