【问题标题】:edittext declared as final, settext not working声明为最终的edittext,settext不起作用
【发布时间】:2017-03-02 19:20:07
【问题描述】:

我有很多edittext来显示一个DatePickerDialog,所以我做了一个方法和edittext作为参数。然后Java说从内部类中访问的参数应该是最终的。

但是当我运行应用程序时,它停在了 edittext.settext() 我怀疑 edittext 作为 final 是问题,因为我有另一个代码不能使 edittext 作为参数运行良好。

这是代码:

     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; 

onCreate 中的状态:

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();
}

....

【问题讨论】:

  • 您的函数 setDateTanggalBeri() 与您的 EditText 初始化在同一个活动或片段中?
  • 是的,它在同一个活动中。我将 EditText 初始化放在另一个方法中,并在 onCreate 中调用它。
  • 你能包含错误信息吗?
  • 我刚刚包含了它。它说'空对象引用',我不知道。

标签: java android nullpointerexception android-edittext settext


【解决方案1】:

既然你说EditText在同一个Activity中,我建议把它设为类私有对象。

例子:

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 不必是finalsetDateTanggalBeri() 方法可以以相同的方式工作。

希望对你有帮助。

【讨论】:

  • 但我必须将editText 作为参数,这样我才能为多个edittext 调用该方法。我有 30 个 editText 来显示 datepickerdialog。
  • 我理解你的问题,让我阅读这里的文档来记住,但是你如何创建一个扩展 EditText 的 并在那里实现它的方法并使用它,@ 987654327@
  • 我补充一下我的使用方法
【解决方案2】:

最终,我解决了受 nullPointerException 文档启发的问题。谢谢大家,所以我有线索来发现这个问题。以前,我在两个地方声明了 editText,在 oncreate 之外和在方法内部。事实证明,方法内部的 editText 重新声明并使其为空或无法被其他方法访问。

为了更清楚,这里是之前和之后的解决方案:

之前:

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);
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多