【问题标题】:DatePicker wont show date after selectionDatePicker 选择后不会显示日期
【发布时间】:2017-04-26 12:07:34
【问题描述】:

我正在尝试制作一个带走一些东西的片段:

日期

重量

身高

注意事项

现在我被 datePicker 卡住了。 我设法让对话框出现,但是当我选择一个日期时,它会强制关闭应用程序。 我希望它采用我选择的日期并将其显示在此标签中

: 日/月/年

试图期待其他问题,但没有一个对我有帮助。 希望你能:) 这是片段:

public class NewTracker extends Fragment {


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.newtracker, container, false);

}


@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    getActivity().setTitle("מעקב חדש");
    EditText dateSelect = (EditText)getView().findViewById(R.id.dateSelect);
    dateSelect.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DialogFragment picker = new DatePickerFragment();
            picker.show(getFragmentManager(), "datePicker");
        }
    });

}


}

这里是日期选择器片段:

public class DatePickerFragment extends DialogFragment
    implements DatePickerDialog.OnDateSetListener {


@RequiresApi(api = Build.VERSION_CODES.N)
@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);
}

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

    EditText edittext = (EditText) getView().findViewById(R.id.dateSelect);
    String myFormat = "dd/MM/yy"; //In which you need put here
    SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
    edittext.setText(sdf.format(c.getTime()));
    }
}

这是错误日志。

Error:
04-26 15:12:47.022 14245-14245/com.example.matancohen.sg50 E/AndroidRuntime: FATAL EXCEPTION: main
                                                                             Process: com.example.matancohen.sg50, PID: 14245
                                                                             java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
                                                                                 at com.example.matancohen.sg50.DatePickerFragment.onDateSet(DatePickerFragment.java:40)
                                                                                 at android.app.DatePickerDialog.onClick(DatePickerDialog.java:171)
                                                                                 at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:175)
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                 at android.os.Looper.loop(Looper.java:154)
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:6692)
                                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

ahmad 解决后的错误日志:

E/AndroidRuntime: FATAL EXCEPTION: main
                                                                         Process: com.example.matancohen.sg50, PID: 23173
                                                                         java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
                                                                             at com.example.matancohen.sg50.NewTracker.<init>(NewTracker.java:43)
                                                                             at com.example.matancohen.sg50.Tracking$1.onClick(Tracking.java:41)
                                                                             at android.view.View.performClick(View.java:6207)
                                                                             at android.view.View$PerformClick.run(View.java:23639)
                                                                             at android.os.Handler.handleCallback(Handler.java:751)
                                                                             at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                             at android.os.Looper.loop(Looper.java:154)
                                                                             at android.app.ActivityThread.main(ActivityThread.java:6692)
                                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

当我在选择日期后单击“确定”时,它会给我一个强制崩溃 我能做些什么? 谢谢!

【问题讨论】:

  • 你能贴出错误日志吗?
  • getView().findViewById(R.id.dateSelect); 你的 DatePickerDialog 必须以这种方式包含R.id.dateSelect。有吗?
  • 你得到一个空指针异常,因为我认为你的DatePickerDialog 中没有R.id.dateSelect
  • 把你的堆栈跟踪放在这里
  • 编辑了问题@s

标签: java android android-fragments datepicker


【解决方案1】:

您可以尝试以下两种方法中的任何一种:

  1. 将您的public class DatePickerFragment extends DialogFragment 类实现移动到您的片段中.. NewTracker

将您的代码修改为:

  public class NewTracker extends Fragment {


    public static EditText dateSelect;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.newtracker, container, false);
        dateSelect = (EditText) v.findViewById(R.id.dateSelect);
        dateSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment picker = new DatePickerFragment();
                picker.show(getFragmentManager(), "datePicker");
            }
        });
        return v;

    }


    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        getActivity().setTitle("מעקב חדש");
    }

    public static class DatePickerFragment extends DialogFragment
            implements DatePickerDialog.OnDateSetListener {


        @RequiresApi(api = Build.VERSION_CODES.N)
        @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);
        }

        @RequiresApi(api = Build.VERSION_CODES.N)
        @Override
        public void onDateSet(DatePicker view, int year, int month, int day) {
            Calendar c = Calendar.getInstance();
            c.set(year, month, day);
            String myFormat = "dd/MM/yy"; //In which you need put here
            SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
            dateSelect.setText(sdf.format(c.getTime()));
        }
    }
}
  1. 在您的DialogFragment 中使用interface 在选择日期后通知呼叫fragment

【讨论】:

  • 尝试了第一个,现在当我尝试到达 NewTracker 时,它的强制关闭
  • 太长了..在哪里发帖?
  • done ,当我做了你要求我做的事情时,我不得不将 EditText dateSelect 移到 OnViewCreated 之外,以便新的内部类可以调用它
  • 是的 EditText dateSelect 需要声明全局...并像这样初始化它:dateSelect = (EditText)getView().findViewById(R.id.dateSelect);..
  • 还有其他解决方案吗? :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多