2

У меня возникают проблемы с передачей данных между фрагментами в tablayout/viewpager. У меня есть Tablayout с четырьмя вкладками, и переключение включено с помощью viewpager. Я пытаюсь сохранить данные из FirstTabFragment, SecondTabFragment и ThirdTabFragment и получить их на последней вкладке = ReviewFragment. Я реализовал сохранение данных в SharedPreferences, и это работает для первого и второго фрагментов, данные в третьем фрагменте не сохраняются и отображаются как пустые при открытии ReviewFragment.Tablayout/Viewpager: Передача данных между фрагментами

FirstFragment - это Listview, строка в выбранном элементе списка сохраняется. SecondFragment, является editText, введенное значение сохраняется при нажатии следующей кнопки. ThirdFragment также является списком, а код в FirstFragment такой же, как и в этом фрагменте, но не работает так, как предполагалось.

Что я имею в виду не работает по назначению является: Значение в ThirdFragment фактически сохранены в SharedPreferences но не извлекается сразу, когда ReviewFragment открыт. Я знал это, потому что когда я закрываю приложение и снова его открываю, он показывает сохраненное значение из SharedPreferences.

Ниже мой код из ThirdFragment и ReviewFragment

ThirdFragment

private SharedPreferences memory1; 
    private SharedPreferences.Editor edt1; 

    private ListView listView; 
    private ArrayAdapter<String> listAdapter; 

    public MtnPaymentMtdFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View v = inflater.inflate(R.layout.payment_method, container, false); 



     // Find the ListView resource. 
     listView = (ListView) v.findViewById(R.id.mtn_plv); 

     // Create and populate a List 
     String[] p_method = new String[]{"ATM - MasterCard - Visa - Verve", "Online Bank Transfer", "Bank Deposit", "Recharge Card", "Mobile Banking"}; 
     ArrayList<String> p_methods = new ArrayList<String>(); 
     p_methods.addAll(Arrays.asList(p_method)); 

     // Create ArrayAdapter using the list. 
     listAdapter = new ArrayAdapter<String>(this.getActivity(), R.layout.item_row3, p_methods); 

     // Set the ArrayAdapter as the ListView's adapter. 
     listView.setAdapter(listAdapter); 
     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       String selectedFromList = (listView.getItemAtPosition(i).toString().trim()); 

       switch (i) { 
        case 0: 
         MtnReviewFragment fragment = new MtnReviewFragment(); 
         Bundle bundler = new Bundle(); 
         bundler.putString("payment_mtd", selectedFromList); 
         fragment.setArguments(bundler); 
//      memory1 = getActivity().getPreferences(0); 
//      edt1 = memory1.edit(); 
//      edt1.putString("payment_mtd", selectedFromList); 
//      edt1.apply(); 
         ((MtnActivity) getActivity()).setCurrentItem(3, true); 
         break; 
        case 1: 
//      String selectedFromList1 = (listView.getItemAtPosition(i).toString().trim()); 
         memory1 = getActivity().getPreferences(0); 
         edt1 = memory1.edit(); 
         edt1.putString("payment_mtd", selectedFromList); 
         edt1.apply(); 
         ((MtnActivity) getActivity()).setCurrentItem(3, true); 
         break; 
        case 2: 
//      String selectedFromList2 = (listView.getItemAtPosition(i).toString().trim()); 
         memory1 = getActivity().getPreferences(0); 
         edt1 = memory1.edit(); 
         edt1.putString("payment_mtd", selectedFromList); 
         edt1.apply(); 
         ((MtnActivity) getActivity()).setCurrentItem(3, true); 
         break; 
        case 3: 
//      String selectedFromList3 = (listView.getItemAtPosition(i).toString().trim()); 
         memory1 = getActivity().getPreferences(0); 
         edt1 = memory1.edit(); 
         edt1.putString("payment_mtd", selectedFromList); 
         edt1.apply(); 
         ((MtnActivity) getActivity()).setCurrentItem(3, true); 
         break; 
        case 4: 
//      String selectedFromList4 = (listView.getItemAtPosition(i).toString().trim()); 
         memory1 = getActivity().getPreferences(0); 
         edt1 = memory1.edit(); 
         edt1.putString("payment_mtd", selectedFromList); 
         edt1.apply(); 
         ((MtnActivity) getActivity()).setCurrentItem(3, true); 
       } 
      } 
     }); 
     return v; 
    } 
} 

ReviewFragment

private SharedPreferences memory; 
private SharedPreferences.Editor edt; 
private TextView rev_bundle_result; 
private TextView rev_mob_result; 
private TextView rev_pmtd_result; 
public static SharedPreferences savedSharedPreference; 
public static String filename = "nameValue"; 
private static final String REGISTER_URL = "http://zzzzzzzzz.com/xxxxx/register.php"; 


public MtnReviewFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View v = inflater.inflate(R.layout.review_layout, container, false); 
    rev_bundle_result = (TextView) v.findViewById(R.id.rev_bundle_result); 
    rev_mob_result = (TextView) v.findViewById(R.id.rev_mob_result); 
    rev_pmtd_result = (TextView) v.findViewById(R.id.rev_pmtd_result); 
    Button make_payment = (Button) v.findViewById(R.id.make_payment_but); 

    memory = getActivity().getPreferences(0); 
    String bundles = memory.getString("bundle_name", "empty"); 
    String mob_number = memory.getString("mob_number", "empty"); 
    String payment_mtds = memory.getString("payment_mtd", "empty"); 
    String p_amount = memory.getString("amount", "empty"); 

    rev_bundle_result.setText(bundles); 
    rev_mob_result.setText(mob_number); 
    rev_pmtd_result.setText(payment_mtds); 
+0

Четвертая вкладка отображается, как только вы достигаете третьей компоновки. Обновите четвертую вкладку, когда пользователь переключится на эту вкладку. 'setUserVisibleHint' – kushpf

ответ

0

Попробуйте использовать commit() Intead apply() для SharedPreferences если вы хотите быть уверенным, что ваши изменения были сохранены до продолжения.

apply() внести изменения асинхронно, а commit() сохранить изменения синхронно. https://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply()

Кроме того, я видел ваш код, и вы вызываете и запускаете свою деятельность в контейнере, вы должны использовать шаблон слушателя, который советует андроид. Ознакомьтесь с рекомендациями или начните с этой должности: Send data between fragments in a pagerAdapter

+0

Я пробовал, что Гонсало, это было то же самое. Не работает. –

+0

Попробуйте использовать 'commit()' и посмотреть, что он возвращает. – Gonzalo

+0

Спасибо, Гонсало, но его все равно то же самое, я тестировал его раньше. Как вы думаете, что могло бы вызвать это. отправленные данные не отображаются в ReviewFragment сразу, но когда я закрываю и снова открываю приложение, это значение отображается. Я даже добавил progressdialog, потому что я думал, что, возможно, sharedpreferennces понадобилось несколько секунд, чтобы сохранить значение. Но все равно то же самое. –

0

Логика метода getview viewpager создает только левый и правый фрагменты без него. вы можете попытаться установить ограничение страницы setOffscreenPageLimit().

Но нецелесообразно загружать весь фрагмент. Возможно, это решит вашу проблему.

1

Это немного старый, и вы, вероятно, нашли решение уже, но только в том случае, если кто-то заканчивает здесь и нужен ответ ...

Я думаю, ваша проблема может быть потому, что в вашем ReviewFragment , вы получаете данные из SharedPreferences в методе onCreateView().

Ваш отзывFragment, вероятно, создается при прокрутке к третьему фрагменту. ViewPagers обычно создают некоторые фрагменты раньше времени, чтобы повысить производительность при прокрутке пользователя. Поэтому, когда вызывается ReviewFragment.onCreateView(), ThirdFagment еще не сохранил свои данные в SharedPreferences. Добавьте точку останова в свой обзорный фрагмент.onCreateView() и проверьте, что это происходит.

Я думаю, вам нужно добавить OnPageChangeListener в ViewPager и сделать ReviewFragment получать данные из SharedPreferences только тогда, когда они становятся видимыми. Также проверьте Fragment.setUserVisibleHint(). Раньше он не работал должным образом с ViewPagers, но я слышал, что это исправлено.

0

Here - решение для отправки данных в фрагмент tablayout/viewpagers из фрагмента.

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