2014-11-04 2 views
0

У меня есть фрагмент, который содержит EditText, когда я нажимаю на этот EditText, появляется диалоговое окно DatePicker, чтобы выбрать дату.
FragmentFileОтправить данные из диалогового окна Fragment в фрагмент

public class FirstFragment extends Fragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_first, container, false); 
     EditText editText = (EditText) view.findViewById(R.id.visitDateFiled); 

     editText.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       DialogFragment picker = new DatePickerFragment(); 
       picker.show(getFragmentManager(), "Date Picker"); 
      } 
     }); 
     return view; 
    } 

DialogFragment

public class DatePickerFragment extends DialogFragment 
     implements DatePickerDialog.OnDateSetListener { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // Use the current date as the default date in the picker 
     final Calendar c = Calendar.getInstance(); 
     int year = c.get(Calendar.YEAR); 
     int month = c.get(Calendar.MONTH); 
     int day = c.get(Calendar.DAY_OF_MONTH); 
     // Create a new instance of DatePickerDialog and return it 
     return new DatePickerDialog(getActivity(), this, year, month, day); 
    } 

    @Override 
    public void onDateSet(DatePicker view, int year, int month, int day) { 
     Calendar c = Calendar.getInstance(); 
     c.set(year, month, day); 

     SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 
     String formattedDate = sdf.format(c.getTime()); 

    } 
} 

Проблема, которую я не знаю, как передать данные (выбранная дата) от DialogFragment фрагменту?
Я прочитал какую-то тему, но это не помогло мне смутить (Извините, что снова задал этот вопрос).

Topic 1 Topic 2

+0

Вы можете попробовать использовать Observer http://andhradroid.wordpress.com/2012/04/05/object-observer-pattern -in-android/ – Heisenberg

+0

попробуйте использовать интерфейс –

+0

Я пробовал это, но он не сработал – Chlebta

ответ

2

У меня есть проблема с благодарностью this topic, вторая ответная тема.
DatePickerFragment.java

@Override 
    public void onDateSet(DatePicker view, int year, int month, int day) { 
     Calendar c = Calendar.getInstance(); 
     c.set(year, month, day); 

     SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 
     String formattedDate = sdf.format(c.getTime()); 
     // in this part I stored the selected date into the intent 
     Intent i = new Intent(); 
     i.putExtra("selectedDate",formattedDate); 
     getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, i); 
    } 

Фрагмент файла

public static final int DATEPICKER_FRAGMENT=1; // adding this line 
@Override 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_feeding, container, false); 
    EditText editText = (EditText) view.findViewById(R.id.foodDeliveryDateFiled); 

    editText.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      DialogFragment picker = new DatePickerFragment(); 
      picker.setTargetFragment(FeedingFragment.this, DATEPICKER_FRAGMENT); 
      picker.show(getFragmentManager().beginTransaction(), "Date Picker"); 
     } 
    }); 
    return view; 
} 
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch(requestCode) { 
     case DATEPICKER_FRAGMENT: 
      if (resultCode == Activity.RESULT_OK) { 
       // here the part where I get my selected date from the saved variable in the intent and the displaying it. 
       Bundle bundle=data.getExtras(); 
       String resultDate = bundle.getString("selectedDate","error"); 
       EditText editText = (EditText) getView().findViewById(R.id.foodDeliveryDateFiled); 
       editText.setText(resultDate); 
      } 
      break; 
    } 
3

Обновленный код


FragmentFile

public class FirstFragment extends Fragment implements DatePickerDialogFragmentEvents{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_first, container, false); 
     EditText editText = (EditText) view.findViewById(R.id.visitDateFiled); 

     editText.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       DialogFragment picker = new DatePickerFragment(); 
       picker.setDatePickerDialogFragmentEvents(FirstFragment.this); //Changed 
       picker.show(getFragmentManager(), "Date Picker"); 
      } 
     }); 
     return view; 
    } 

    //This is where you will get selected date value 
    @Override 
    public void onDateSelected(String date) { 
     String selectedDate = date; 
    } 
} 

DialogFragment

public class DatePickerFragment extends DialogFragment 
     implements DatePickerDialog.OnDateSetListener { 

    //Interface created for communicating this dialog fragment events to called fragment 
    public interface DatePickerDialogFragmentEvents{ 
     void onDateSelected(String date); 
    } 

    DatePickerDialogFragmentEvents dpdfe 

    public void setDatePickerDialogFragmentEvents(DatePickerDialogFragmentEvents dpdfe){ 
     this.dpdfe = dpdfe; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // Use the current date as the default date in the picker 
     final Calendar c = Calendar.getInstance(); 
     int year = c.get(Calendar.YEAR); 
     int month = c.get(Calendar.MONTH); 
     int day = c.get(Calendar.DAY_OF_MONTH); 
     // Create a new instance of DatePickerDialog and return it 
     return new DatePickerDialog(getActivity(), this, year, month, day); 
    } 

    @Override 
    public void onDateSet(DatePicker view, int year, int month, int day) { 
     Calendar c = Calendar.getInstance(); 
     c.set(year, month, day); 

     SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 
     String formattedDate = sdf.format(c.getTime()); 
     dpdfe.onDateSelected(formattedDate); //Changed 
    } 
} 

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

+0

Измененная строка 'picker.setDatePickerDialogFragmentEvents (FirstFragment.this); // Изменено' не может быть разрешено. ?? – Chlebta

+0

проверить для меня таким образом работает. там вам нужно передать экземпляр фрагмента «this» ... так как он находится внутри setOnClickListener, который передается как FirstFragment.this, как будто я передаю это, тогда он возьмет этот clicklisterner и его ошибку. –

+0

У меня есть проблема с использованием второго ответа этого раздела: http: // stackoverflow.com/questions/18579590/how-to-send-data-from-dialogfragment-to-a-fragment – Chlebta

0

Каждый ответ первого программиста Java должен был создать наблюдаемый или обратный вызов и отправить его. Хотя это было бы приемлемой практикой в ​​большинстве мест, при работе с Фрагментами и DialogFragments опыт не такой красивый, из-за государственных потерь при воссоздании, повороте, приостановке ... вы обязательно получите IllegalStateExceptions, которого вы не ожидаете.

Мой совет, в то время как немного резкий, заключается в том, чтобы переместить ваши шаблоны связи из семейства обратных вызовов интерфейса, которые передаются на централизованную шину событий, такую ​​как Otto или GreenRobot. Он отлично работает как на переднем плане, так и в фоновом режиме для любого состояния и помогает развязывать использование.

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