نولبونتيركسيبتيون عندما سيتكست إلى إديتكست-أونداتيسيت
-
20-12-2019 - |
سؤال
لدي إديتكست ، حيث عندما ينقر المستخدم عليه ، يظهر مربع حوار التاريخ ، وعندما يتم تعيين التاريخ ، يجب أن يظهر التاريخ في حقل إديتكست.على الرغم من بسيطة بما فيه الكفاية ، لا أستطيع أن أجد لماذا أحصل على استثناء نولبوانتر.لقد جربت عدة طرق وغيرت الكود الخاص بي كثيرا ، لكن لا شيء يعمل.هنا هو واحد من مفاهيم قانون بلدي:
ابدأ الفصل:
public class Start extends FragmentActivity {
int year;
int month;
int day;
static final int DATE_DIALOG_ID = 999;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
EditText editText = (EditText) findViewById(R.id.etDepDate);
editText.setText("date");
}
public void showDatePickerDialog(View v) {
DialogFragment newFragment = new DatePick();
newFragment.show(getFragmentManager(), "datepicker");
}
}
فئة اختيار التاريخ:
public class DatePick extends DialogFragment implements
DatePickerDialog.OnDateSetListener {
EditText editText;
@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);
}
public void onDateSet(DatePicker view, int year, int month, int day) {
// Do something with the date chosen by the user
editText = (EditText) view.findViewById(R.id.etDepDate);
editText.setText(day + "/" + month + "/" + year);
}
@Override
public void show(FragmentManager manager, String tag) {
// TODO Auto-generated method stub
super.show(manager, tag);
}
}
أيضا شمل:
<EditText
android:id="@+id/etDepDate"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:ems="10"
android:focusable="false"
android:hint="@string/dhint"
android:inputType="date"
android:onClick="showDatePickerDialog" >
<requestFocus />
</EditText>
كنت قد جعلت من العمل مع طريقة أخرى ، ولكن يتم إهمالها وأنا لا أريد استخدامه.ديالوغفراغمنتس يبدو الطريق الصحيح للقيام بذلك.
تحرير:
11-14 20:38:06.368: E/AndroidRuntime(31557): FATAL EXCEPTION: main
11-14 20:38:06.368: E/AndroidRuntime(31557): java.lang.NullPointerException
11-14 20:38:06.368: E/AndroidRuntime(31557): at com.xxx.mytrips.DatePick.onDateSet(DatePick.java:36)
11-14 20:38:06.368: E/AndroidRuntime(31557): at android.app.DatePickerDialog.tryNotifyDateSet(DatePickerDialog.java:148)
11-14 20:38:06.368: E/AndroidRuntime(31557): at android.app.DatePickerDialog.onClick(DatePickerDialog.java:116)
11-14 20:38:06.368: E/AndroidRuntime(31557): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
11-14 20:38:06.368: E/AndroidRuntime(31557): at android.os.Handler.dispatchMessage(Handler.java:99)
11-14 20:38:06.368: E/AndroidRuntime(31557): at android.os.Looper.loop(Looper.java:137)
11-14 20:38:06.368: E/AndroidRuntime(31557): at android.app.ActivityThread.main(ActivityThread.java:5041)
11-14 20:38:06.368: E/AndroidRuntime(31557): at java.lang.reflect.Method.invokeNative(Native Method)
11-14 20:38:06.368: E/AndroidRuntime(31557): at java.lang.reflect.Method.invoke(Method.java:511)
11-14 20:38:06.368: E/AndroidRuntime(31557): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
11-14 20:38:06.368: E/AndroidRuntime(31557): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
11-14 20:38:06.368: E/AndroidRuntime(31557): at dalvik.system.NativeStart.main(Native Method)
المحلول
انها لأنك تستخدم editText = (EditText) view.findViewById(R.id.etDepDate);
.فيندفيوبيد يعود نول في هذه الحالة لأن إديتكست ليس طفل من وجهة نظر ديتبيكر.
إذا كان إديتكست هو جزء من عرض المحتوى من النشاط الخاص بك يمكنك استخدام هذا :
editText = (EditText) getActivity().findViewById(R.id.etDepDate);
هذه ليست ممارسة جيدة حقا بالمناسبة.ويفضل أن تمر أونداتيسيتليستينر الخارجية إلى جزء.
نصائح أخرى
هذا الخط
editText = (EditText) view.findViewById(R.id.etDepDate);
يعطيك خطأ حيث لا يمكنك العثور على EditText
في DatePicker
.سوف تحتاج إلى تمرير الخاص بك EditText
في منشئ ل DatePick
أو بطريقة ما تمرير القيمة مرة أخرى إليها في أصلها Activity
إنشاء منشئ بالنسبة لك فئة ديتبيكر وتمرير إديتكست لذلك.على سبيل المثال:
public DatePickerFragment (EditText editText) {
this.editText = editText;
}
ثم ببساطة استخدامه في onDateSet()
الطريقة.
استخدم
giveacodicetagpre.بدلا من
giveacodicetagpre.لأنه ليس لديك EDITTEXT في مربع الحوار DatePick الخاص بك .. بسبب هذا البحث فقط FindViewid () العودة NULL ..
ماذا لو قمت بإزالة العرض من هذه الوظيفة؟
giveacodicetagpre.لا يمكنك الوصول EditText
داخل DatePick
صف دراسي.تحتاج إلى إرسال النص مرة أخرى إلى Start
من عند DatePick
صف دراسي.يمكنك أن تفعل ذلك بهذه الطريقة.
تحديد واجهة وطريقة رد الاتصال في
DatePick
صف دراسي.callbackListener listener; interface callbackListener { public void setText(String text); }
تنفيذ الواجهة في
Start
صف دراسي.class Start extends FragmentActivity implements DatePick.callbackListener { ..... @Override public void setText(String text) { EditText editText = (EditText) view.findViewById(R.id.etDepDate); editText.setText(text);
}
في
onAttach
طريقةDatePick
فئة تعيين النشاط الأصلي إلى كائن واجهة.@Override public void onAttach(Activity activity) { super.onAttach(activity); listener = (callbackListener) activity; }
4.اتصل بطريقة رد الاتصال في onDateSet
طريقة وتمرير النص
public void onDateSet(DatePicker view, int year, int month, int day) {
listener.setText(day + "/" + month + "/" + year);
}
نظرا لأن Edittext الخاص بك في نشاط جزء وليس في DatePicker DialogFragment لا يمكنك الوصول إليه مباشرة بهذه الطريقة.حاول إنشاء مرجع إلى نشاط شظيةك والوصول إليه من خلال طريقة.أعلن نطاق Edittext ليتم الوصول إلى الوصول عبر هذا النشاط.ثم،
giveacodicetagpre.وعقل إعادة بناء طريقة OnDateset DialogFragment الخاصة بك مثل هذا.
giveacodicetagpre.