Nullpointerexception 이 때 setText 을 EditText-onDateSet
-
20-12-2019 - |
문제
가 editText,어디를 클릭할 때,그 날짜에 대화 상자가 나타나며면 날짜가 설정된 날짜에 나타나야 합니다 editText 필드입니다.간단하지만,충분히 나 can't find 왜 얻을 nullPointer 예외는 아니다.나는 시도는 여러 가지 방법으로 변경 내 코드는 많은,하지만 아무것도 작동하지 않습니다.여기에서 그것은 하나의 개념 나의 코드:
시작 클래스:
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");
}
}
DatePick 클래스:
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);
}
}
또한 XML:
<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>
나도 그것은 작품 다른 방법으로,하지만 그것은 사용되지 않으며 I don't 은 그것을 사용하고 싶습니다.DialogFragments 인 오른쪽 그것을 할 수있는 방법입니다.
편집:
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);
를 사용하고 있기 때문입니다.FindViewById EditText는 DatePicker보기의 자식이 아니기 때문에이 경우에 NULL을 반환합니다.
EditText가 활동의 콘텐츠보기의 일부인 경우 다음을 사용할 수 있습니다.
editText = (EditText) getActivity().findViewById(R.id.etDepDate);
이것은 실제로 좋은 방법이 아닙니다.바람직하게는 외부 OnDateSetListener를 조각에 전달합니다.
다른 팁
이라인
editText = (EditText) view.findViewById(R.id.etDepDate);
은 당신에 오류가 당신을 찾을 수 없습니다 EditText
에 DatePicker
.를 전달해야 합 h EditText
에서 생성자 DatePick
나 어떻게든 값을 전달에서 그것을 다시는 그것의 orignal Activity
DatePicker 클래스를 위해 생성자를 만들고 EditText를 전달합니다. 예 :
public DatePickerFragment (EditText editText) {
this.editText = editText;
}
.
을 누른 다음 onDateSet()
메소드에서 사용하기 만하면됩니다.
사용
editText = (EditText) getActivity().findViewById(R.id.etDepDate);
.
대신
editText = (EditText) view.findViewById(R.id.etDepDate);
.
DatePick 대화 상자에 EditText가 없습니다.이 유일한 findViewById () in null ..
이 함수에서보기를 제거하면 어떻게됩니까?
public void onDateSet(DatePicker view, int year, int month, int day) {
// Do something with the date chosen by the user
//so instead of:
//editText = (EditText) view.findViewById(R.id.etDepDate);
//use this:
editText = (EditText) findViewById(R.id.etDepDate);
editText.setText(day + "/" + month + "/" + year);
}
. 당신은에 액세스할 수 없 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.전화 callback 메서드 onDateSet
방법 통과하는 텍스트
public void onDateSet(DatePicker view, int year, int month, int day) {
listener.setText(day + "/" + month + "/" + year);
}
EditText가 Fragment Activity에 있고 DatePicker DialogFragment가 아닌이 방식으로 직접 액세스 할 수 없습니다.조각 활동에 대한 참조를 만들고 메소드를 통해 액세스하십시오.이 활동에서 EditText의 범위에 액세스 할 범위를 선언하십시오.그런 다음
public void setDate(String Dte){
editText.setText(Dte);
}
.
이와 같이 대화 구멍 OnDateSet 메서드를 재구성합니다.
public void onDateSet(DatePicker view, int year, int month, int day) {
// Do something with the date chosen by the user
((MainActivity)getActivity()).setDate(day + "/" + month + "/" + year);
}
.