2016-12-24 4 views
0

Я написал пользовательские DatePickerDialog, который проходит DialogFragment и реализует DatePickerDialog.OnDateSetListener.Как вызвать функцию-член класса, которые проходят DialogFragment в деятельности

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
    DatePickerDialog dpd = new DatePickerDialog(getActivity(), 
       R.style.MyDialogTheme, this, year, month, day); 
    return dpd; 
    } 

    public void onDateSet(DatePicker view, int year, int month, int day) { 

    } 

    // own methods 
    String getFormattedDate() { 
    } 
} 

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

public class Booking_activity extends AppCompatActivity implements View.OnClickListener { 

    public void onClick(View view) { 
    if (view == imgView_from) { 
     // Initialize a new date picker dialog fragment 
     DialogFragment dFragment = new DatePickerFragment(); 
     // Show the date picker dialog fragment 
     dFragment.show(getFragmentManager(), "Date Picker"); 

     // error 
     dFragment.getFormattedDate(); 
    } 
    } 
} 

ответ

2

Ошибка возникает из-за того, что вы пытаетесь получить доступ к недопустимому методу от DialogFragment. Вам нужно создать DatePickerFragment с:

DatePickerFragment dFragment = new DatePickerFragment(); 

или отливая его:

DialogFragment dFragment = new DatePickerFragment(); 
((DatePickerDialog)dFragment).getFormattedDate(); 

Но главного недостатка это, вы пытаетесь сдерживающим доступ к getFormattedDate() method до объекта dFragment имеет заканчивает экземпляр. Помните, что show() - это асинхронный вызов.

Таким образом, вы должны сообщить об активности Booking_activity, когда закончилось создание экземпляра dFragment. Вы можете использовать для этого интерфейс. Что-то вроде следующего:

  1. В вашем DatePickerFragment добавить интерфейс:

    public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { 
    
        private DatePickerListener mListener; 
    
        public interface DatePickerListener { 
        void onDialogFinishInitialized(); 
        } 
    
        @Override 
        public Dialog onCreateDialog(Bundle savedInstanceState) { 
        DatePickerDialog dpd = new DatePickerDialog(getActivity(), 
          R.style.MyDialogTheme, this, year, month, day); 
    
        // you need to inform the activity when Dialog has finish 
        // initialized. 
        mListener.onDialogFinishInitialized(); 
    
        return dpd; 
        } 
    
        ... 
    
        // Need to add the activity as the listener. 
        @Override 
        public void onAttach(Activity activity) { 
        super.onAttach(activity); 
        // This makes sure that the container activity has implemented 
        // the listener interface. If not, it throws an exception 
        try { 
         mListener = (DatePickerListener) activity; 
        } catch (ClassCastException e) { 
         throw new ClassCastException(activity.toString() + " must implement DatePickerListener"); 
        } 
        } 
    
        ... 
    
    } 
    
  2. Реализовать интерфейс в вашей деятельности и вызовите getFormattedDate() метод:

    public class Booking_activity extends AppCompatActivity 
    implements View.OnClickListener, DatePickerFragment.DatePickerListener { 
        ... 
        private DatePickerFragment dFragment; 
        ... 
        @Override 
        public void onDialogFinishInitialized() { 
        // You can call the method here now 
        dFragment.getFormattedDate(); 
        } 
        ... 
    } 
    
1

Вам необходимо инициализировать новый диалог фрагмент выбора даты с:

DatePickerFragment dFragment = new DatePickerFragment(); 

Как и в следующем коде:

public class Booking_activity extends AppCompatActivity implements View.OnClickListener { 
    public void onClick(View view) { 
    if (view == imgView_from) { 

     // Initialize a new date picker dialog fragment 
     DatePickerFragment dFragment = new DatePickerFragment(); // Changed this 

     // Show the date picker dialog fragment 
     dFragment.show(getFragmentManager(), "Date Picker"); 

     // error 
     dFragment.getFormattedDate(); 
    } 
    } 
} 
0

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

((DatePickerDialog)dFragment).getFormattedDate(); 
0

Сделайте функцию режима доступа к getFormattedDate общественного, как показано ниже

public String getFormattedDate() { 
     } 

решит вашу проблему.

0

выбранное решение работает хорошо, но я хотел бы указать, что функция onAttach() не рекомендуется. Я нашел несколько решений здесь: Android Fragment onAttach() deprecated

Я думаю, что самый популярный ответ был таков:

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    activity = getActivity(); 
} 

Они меняются onAttach (активность) активность в onAttach (контекст Context).

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/16739288) – litelite

+0

Извините, я обновил! –