2015-04-15 3 views
2

Я делаю свое первое основное приложение для Android, и я пытаюсь показать диалог в ActionBarActivity. Я создал подкласс DialogFragment:DialogFragment.show() throws NullPointerException

public class QuestionFragment extends DialogFragment { 
private final String[] CHOICES = {"More than once per day","Once per day","Less often"}; 

public QuestionFragment() { 
    //Required empty constructor 
} 

public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setTitle("How often do you take this medication?") 
      .setItems(CHOICES, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        //options for int which go here 
       } 
      }); 
    return builder.create(); 
} 
} 

Я пытаюсь использовать метод показа очень похожим образом, как учебники для разработчиков Android объяснить. Диалог должен придумать, когда кнопка нажата:

public void toAdd(View view) { 
    QuestionFragment dialog = new QuestionFragment(); 
    dialog.show(dialog.getFragmentManager(),"question"); 
} 

Когда я пытаюсь это, я получаю:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.FragmentTransaction android.app.FragmentManager.beginTransaction()' on a null object reference 
     at android.app.DialogFragment.show(DialogFragment.java:228) 
     at gianttine.rescription.TodayMeds.toAdd(TodayMeds.java:49) 
     ... 

Я также попытался изменить (dialog.getFragmentManager(),"question"); к (getFragmentManager(),"question");, и я также попытался сделать объект FragmentManager, прежде чем передать его в show().

Поскольку я новичок в разработке Android, у меня могут быть некоторые плохие варианты дизайна в этом коде, но я ищу, чтобы узнать, почему существует исключение и что мне нужно сделать для правильного отображения диалога.

ответ

2

Вы не можете использовать dialog.getFragmentManager(), когда ваше диалоговое окно даже не связано с деятельностью, и поэтому НЕ МОЖЕТ иметь доступ к FragmentManager. Это возможно только после присоединения.

Что вам нужно сделать, это получить действительный FragmentManager, то есть от компонента, который вызывает ваш метод toAdd().

Итак:

public void toAdd(View view) { 
    QuestionFragment dialog = new QuestionFragment(); 
    dialog.show(getFragmentManager() /*<--- depends where it's invoked, inside an Activity it's the right way, inside another Fragment, it would be getChildFragmentManager*/,"question"); 
} 
Смежные вопросы