Java edittext声明为最终版本,settext不起作用
我有很多edittext来显示DatePickerDialog,所以我创建了一个方法,并将edittext作为参数。然后Java说,当从内部类中访问时,参数应该是最终的 但当我运行应用程序时,它在edittext.settext()处停止。我怀疑edittext作为最终版本是问题所在,因为我有另一个代码无法使edittext作为参数运行良好 代码如下:Java edittext声明为最终版本,settext不起作用,java,android,nullpointerexception,android-edittext,settext,Java,Android,Nullpointerexception,Android Edittext,Settext,我有很多edittext来显示DatePickerDialog,所以我创建了一个方法,并将edittext作为参数。然后Java说,当从内部类中访问时,参数应该是最终的 但当我运行应用程序时,它在edittext.settext()处停止。我怀疑edittext作为最终版本是问题所在,因为我有另一个代码无法使edittext作为参数运行良好 代码如下: public DatePickerDialog setDateTanggalBeri(final EditText editTangg
public DatePickerDialog setDateTanggalBeri(final EditText editTanggal){
DatePickerDialog datePickTgl;
Calendar newCalendar = Calendar.getInstance();
datePickTgl = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
final Calendar newDate = Calendar.getInstance();
newDate.set(i,i1,i2);
editTanggal.setText(dateFormatter.format(newDate.getTime()));
}
},newCalendar.get(Calendar.YEAR),newCalendar.get(Calendar.MONTH),newCalendar.get(Calendar.DAY_OF_MONTH));
return datePickTgl;
}
下面是错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.droid.anindya.jadwalimunisasibayiku, PID: 5669
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.EditText.setText(java.lang.CharSequence)' on a null object reference
at com.droid.anindya.jadwalimunisasibayiku.Display_Jadwal$1.onDateSet(Display_Jadwal.java:209)
at android.app.DatePickerDialog.onClick(DatePickerDialog.java:137)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:163)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我就是这样实施的:
在onCreate之外声明:
DatePickerDialog DPD1;
DatePickerDialog DPD2;
DatePickerDialog DPD3;
DatePickerDialog DPD4;
DatePickerDialog DPD5;
DPD1 = setDateTanggalBeri(textTgl1);
DPD2 = setDateTanggalBeri(textTgl2);
DPD3 = setDateTanggalBeri(textTgl3);
DPD4 = setDateTanggalBeri(textTgl4);
DPD5 = setDateTanggalBeri(textTgl5);
....
在onCreate中声明:
DatePickerDialog DPD1;
DatePickerDialog DPD2;
DatePickerDialog DPD3;
DatePickerDialog DPD4;
DatePickerDialog DPD5;
DPD1 = setDateTanggalBeri(textTgl1);
DPD2 = setDateTanggalBeri(textTgl2);
DPD3 = setDateTanggalBeri(textTgl3);
DPD4 = setDateTanggalBeri(textTgl4);
DPD5 = setDateTanggalBeri(textTgl5);
....
单击时编辑文本:
public void tanggalBeri1Clicked(View view) {
DPD1.show();
}
public void tanggalBeri2Clicked(View view) {
DPD2.show();
}
....
既然您说过,
EditText
在同一个活动中,我建议将其设置为类私有对象
例如:
public class MainActivity extends AppCompatActivity {
private EditText editTanggal; //declaration
@Override
protected void onCreate(Bundle savedInstanceState) {
...
//Initiate the EditText here
//Example:
//editTanggal = (EditText) findViewById(R.id.editText);
...
}
...
public DatePickerDialog setDateTanggalBeri() {
DatePickerDialog datePickTgl;
Calendar newCalendar = Calendar.getInstance();
datePickTgl = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
final Calendar newDate = Calendar.getInstance();
newDate.set(i, i1, i2);
editTanggal.setText(dateFormatter.format(newDate.getTime())); //Only use
}
}, newCalendar.get(Calendar.YEAR), newCalendar.get(Calendar.MONTH), newCalendar.get(Calendar.DAY_OF_MONTH));
return datePickTgl;
}
}
通过这种方式,EditText
不必是final
,setDateTanggalBeri()
方法也可以以同样的方式工作
我希望它能有所帮助。最终,我解决了源自nullPointerException文档的问题。谢谢大家,所以我有线索来发现这个问题。之前,我在oncreate之外和方法内部两个位置声明了editText。结果是,方法中的editText重新声明并使其为null,或者其他方法无法访问它
更清楚地说,以下是解决方案之前和之后的内容:
之前:
EditText textTgl1;
EditText textTgl2;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.table_jadwal);
......
setTanggalBeri()
DPD1 = setDateTanggalBeri(textTgl1);
DPD2 = setDateTanggalBeri(textTgl2);
....
}
public void setTanggalBeri(){
EditText textTgl1 = (EditText) findViewById(R.id.editTanggal1);
EditText textTgl2= (EditText) findViewById(R.id.editTanggal2);
}
之后:
EditText textTgl1;
EditText textTgl2;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.table_jadwal);
......
setTanggalBeri()
DPD1 = setDateTanggalBeri(textTgl1);
DPD2 = setDateTanggalBeri(textTgl2);
....
}
public void setTanggalBeri(){
textTgl1 = (EditText) findViewById(R.id.editTanggal1);
textTgl2 = (EditText) findViewById(R.id.editTanggal2);
}
函数setDateTanggalBeri()
与EditText初始化在同一活动或片段中?是的,它在同一活动中。我将EditText初始化放在另一个方法中,并在onCreate中调用它。您能包含错误消息吗?我刚刚包含了它。它说“空对象引用”,我不知道。但是我必须将editText作为一个参数,这样我就可以为多个editText调用该方法。我有30个editText来显示datepickerdialog。我理解您的问题,让我阅读这里的文档来记住,但是如何创建一个扩展editText的类并在其中实现它的方法并使用它,editTanggal.setDateTanggalBeri()
I添加如何使用该方法