2016-07-22 2 views
1

У меня есть несколько фрагментов в ViewPager. Как я могу получить фрагмент первых данных EditText для последнего фрагмента?Как получить данные из первого фрагмента в последний фрагмент?

Я поставил значение в моем первом фрагменте, как показано ниже -

txtConsAcNo.setText(account_no); 
txtMeterSrMo.setText(mtr_serial_no); 

Теперь я получаю это значение txtConsAcNo, txtMeterSrMo на моем последнем фрагменте, как

ценам ниже
ConDetFirstFragment f1 = new ConDetFirstFragment(); 
txtConsAcNo = f1.txtConsAcNo.getText().toString(); 
txtMeterSrMo = f1.txtMeterSrMo.getText().toString(); 

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

ответ

1

очень легко достичь этого без создания интерфейса, Bundle или намерений -

Я объявленное все переменные во всем фрагменте «Public Static», как ниже -

public static EditText txtConsAcNo, txtMeterSrMo; 

После на любом фрагменте я объявил переменный, чтобы получить данные, такие как цен ниже

public static String txtConsAcNo,txtMeterSrMo; 

Теперь я создал функцию, чтобы получить значение из первого фрагмента выше переменной цен ниже

public static void getalldata(){ 
     ConDetFirstFragment f1 = new ConDetFirstFragment(); 
     txtConsAcNo = f1.txtConsAcNo.getText().toString(); 
     txtMeterSrMo = f1.txtMeterSrMo.getText().toString(); 
} 

Счастливого кодирования ...

+0

Вы уверены, что это лучший способ? Сохранение таких ссылок не очень хорошо, потому что у ваших классов будет плотная связь. – Eenvincible

+0

Я уверен, что это легко и просто ... –

+0

Примите мой ответ, чтобы помочь другим. –

0

Есть несколько проблем здесь:

  1. Первый фрагмент может быть разрушен Android системы для экономии памяти.
  2. Ваши фрагменты не должны разговаривать друг с другом непосредственно

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

  1. Если предположить, что исходные тексты являются EditText объектов (то есть. Редактируемые пользователем), а затем добавить TextWatcher к каждому из объектов EditText.

  2. Создание интерфейса:

    public interface TextPurveyor { 
        void setText1(String t); 
        String getText1(); 
        void setText2(String t); 
        String getText1(); 
    } 
    
  3. реализовать этот интерфейс в принимающей деятельности; и сохранить текстовые значения локально в активности. Не забудьте сохранить/восстановить их с остальной частью состояния Activity.

  4. Сделать объекты TextWatcher называют методы соответствующих SetText (..) на хозяин деятельности:

    ((TextPurveyor)getActivity()).setText1(...); 
    
  5. сделать каждый чек фрагмента, что хозяин деятельность реализует этот метод.

  6. Когда второй фрагмент хочет строку, задать активность для него:

    ((TextPurveyor)getActivity()).getText1(); 
    
0

Чтобы избежать связывания кода проекта плотно, попробуйте использовать шаблоны проектирования, которые были доказаны, чтобы работать лучше, как Publisher/Subscriber, как я покажу вам ниже:

Существует популярная библиотека Я всегда использовал в моем проекты под названием EventBus - просто добавьте следующие строки в build.gradle (модуль уровня) файл под зависимостями:

compile 'org.greenrobot:eventbus:3.0.0' 

Во-вторых, создать простой Plain Old Java Object (POJO) представить ваше событие:

public class FragmentAToLastEvent{ 
    private String txtConsAcNo; 
    private String txtMeterSrMo; 

    FragmentAToLastEvent(String acNo, String srMO){ 
     this.txtConsAcNo = acNO; 
     this.txtMeterSrMo = srMO; 
    } 

    //getters and setters if needed 
    public String gettxtConsAcNo(){ 
     return txtConsAcNo; 
    } 

    public String gettxtMeterSrMo(){ 
     return txtMeterSrMo; 
    } 
} 

Следующий шаг на самом деле использовать класс Event здесь:

Таким образом, в вашем фрагменте, который вы хотите отправить текст с EditText, просто сделать это:

String txtConsAcNo = f1.txtConsAcNo.getText().toString(); 
String txtMeterSrMo = f1.txtMeterSrMo.getText().toString(); 
EventBus.getDefault().post(new FragmentAToLastEvent(txtConsAcNo, txtMeterSrMo)); 

В своем последнем фрагменте, просто это для завершения:

Внутри onCreate или onAttach вашего фрагмента:

//register your event - making this class a subscriber 
EventBus.getDefault().register(this) 

//next, override a single method to receive the values you passed from above code (Fragment 1?) 

public void onEvent(FragmentAToLastEvent event){ 

    String txtConsAcNo = event.gettxtConsAcNo(); 
    String txtMeterSrMo = event.gettxtMeterSrMo(); 

    //now you can use your text here without problems! 
} 

Наконец, не забудьте отменить внутри OnDestroy:

@Override 
public void onDestroy(){ 
    super.onDestroy(); 

    EventBus.getDefault().unregister(this); 
} 

Это то, что я всегда делал и чище, без использования интерфейсов, которые ваши фрагменты должны реализовать и сделать все это!

Надеюсь, вы сочтете это полезным для вас и удачи!

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