سؤال

لدي إديتكست ، حيث عندما ينقر المستخدم عليه ، يظهر مربع حوار التاريخ ، وعندما يتم تعيين التاريخ ، يجب أن يظهر التاريخ في حقل إديتكست.على الرغم من بسيطة بما فيه الكفاية ، لا أستطيع أن أجد لماذا أحصل على استثناء نولبوانتر.لقد جربت عدة طرق وغيرت الكود الخاص بي كثيرا ، لكن لا شيء يعمل.هنا هو واحد من مفاهيم قانون بلدي:

ابدأ الفصل:

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 صف دراسي.يمكنك أن تفعل ذلك بهذه الطريقة.

  1. تحديد واجهة وطريقة رد الاتصال في DatePick صف دراسي.

    callbackListener listener;
    
    interface callbackListener {
    public void setText(String text);
    }
    
  2. تنفيذ الواجهة في 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);
    

    }

  3. في 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top