Я использую Robotium для тестирования своего проекта. В тесте, когда я вызываю datePickerDialog.getDatePicker (), я всегда получаю NullPointerExcpetion.

Мой код DatePickerDialogFragment:

public class DatePicker_Fragment extends SherlockDialogFragment{
    public static final int START_DATE = 1;
    public static final int END_DATE = 2;
    public static final String TAG = "DatePicker";
    private OnDateSetListener listener_m;

    public DatePicker_Fragment(){

    }

    @SuppressLint("NewApi")
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {       

        //get the current time
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);

        //create the dialog
        DatePickerDialog datePickerDialog = new DatePickerDialog(getSherlockActivity(),listener_m,year, month, day);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
            //datePickerDialog.getDatePicker().setSpinnersShown(false);
            //datePickerDialog.getDatePicker().setCalendarViewShown(true);
        }

        return datePickerDialog;
    }

    public void setListener(OnDateSetListener listener){
        listener_m = listener;
    }

}

И это соответствующий код из моего теста

//Select the start date
TextView startDate = (TextView) solo.getView(R.id.tv_StartDate);
solo.clickOnView(startDate);

//wait for dialog fragment
solo.waitForFragmentByTag(DatePicker_Fragment.TAG);


//set the start date
SherlockFragmentActivity current_activity = (SherlockFragmentActivity) solo.getCurrentActivity();
DatePicker_Fragment dp_frag = (DatePicker_Fragment) current_activity.getSupportFragmentManager().findFragmentByTag(DatePicker_Fragment.TAG);
DatePickerDialog dp_dialog = (DatePickerDialog) dp_frag.getDialog();
DatePicker datePicker = dp_dialog.getDatePicker();
solo.setDatePicker(datePicker,2013,6,21);
solo.clickOnText("Set");

Я всегда получаю исключение NullPointerException при вызове dp_dialog.getDatePicker()

1
SacGax 4 Июн 2013 в 12:37
Без robotium он нормально работает?
 – 
itsrajesh4uguys
4 Июн 2013 в 12:50
Настроили ли вы свой Context таким образом, чтобы это мешало загрузке ресурсов / раздутию макета?
 – 
laalto
4 Июн 2013 в 13:15
Нет, я передаю контекст стандартным способом. Datepickerdialog действительно отображается на экране. Только при вызове getDatePicker я получаю исключение.
 – 
SacGax
4 Июн 2013 в 13:29
Вы передали этот аргумент или аргумент контекста в диалоговом окне?
 – 
itsrajesh4uguys
4 Июн 2013 в 13:32
Попробуйте вот так DatePickerDialog dp_dialog = (DatePickerDialog) dp_frag.getDialog (this); вместо этого вы также можете передать контекст
 – 
itsrajesh4uguys
4 Июн 2013 в 13:35

1 ответ

Лучший ответ

Итак, дело в том, что я вызывал dp_frag.getDialog () слишком рано, еще до того, как фрагмент отображался, поэтому для этого я изменил свой код следующим образом:

       //wait for dialog fragment
        solo.waitForFragmentByTag(DatePicker_Fragment.TAG);

        //get a reference to dialog fragment
        SherlockFragmentActivity current_activity = (SherlockFragmentActivity) solo.getCurrentActivity();
        DatePicker_Fragment dp_frag = (DatePicker_Fragment) current_activity.getSupportFragmentManager().findFragmentByTag(DatePicker_Fragment.TAG);

        //wait until dialog fragment is visible on screen
        assertNotNull(dp_frag);
        while(!(dp_frag.isShown())){
            Log.w(getName(), "Dialog fragment visible " + dp_frag.isShown());
            solo.sleep(100);
        }

        //set the start date
        DatePickerDialog dp_dialog = (DatePickerDialog) dp_frag.getDialog();
        assertNotNull(dp_dialog);
        DatePicker datePicker = dp_dialog.getDatePicker();
        solo.setDatePicker(datePicker,2013,5,21);
        solo.clickOnView(dp_dialog.getButton(DatePickerDialog.BUTTON_POSITIVE));

А в DatePickerDialogFragment я добавил следующий метод:

public boolean isShown(){
    if(getDialog() == null){
        return false;
    }else{
        return true;
    }
}
0
SacGax 4 Июн 2013 в 16:47