2017-03-02 125 views
1

我有很多edittext来显示DatePickerDialog,所以我使用方法和edittext作为参数。然后Java说,从内部类访问参数应该是最终的。edittext声明为final,settext不起作用

但是,当我运行应用程序,它停在edittext.settext()我怀疑edittext作为最终的问题,因为我有另一个代码,不会使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; 

状态我n面的onCreate:

DPD1 = setDateTanggalBeri(textTgl1); 
DPD2 = setDateTanggalBeri(textTgl2); 
DPD3 = setDateTanggalBeri(textTgl3); 
DPD4 = setDateTanggalBeri(textTgl4); 
DPD5 = setDateTanggalBeri(textTgl5); 
.... 

EDITTEXT上点击:

public void tanggalBeri1Clicked(View view) { 
     DPD1.show(); 
} 
public void tanggalBeri2Clicked(View view) { 
    DPD2.show(); 
} 

.... 
+0

你的函数'setDateTanggalBeri()'是在同一活动或你的EditText初始化片段? –

+0

是的,它是在同一个活动。我将EditText初始化放在另一个方法中,并在onCreate中调用它。 –

+0

你能否包含错误信息? –

回答

3

既然你说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()方法可以以相同的方式工作。

我希望它有帮助。

+0

但我必须使editText作为参数,所以我可以调用多个edittext的方法。我有30个editText来显示datepickerdialog。 –

+0

我理解你的问题,让我在这里阅读文档记住,但是你如何创建一个扩展的EditText一个** **类和在那里实现其方法和使用它,'editTanggal.setDateTanggalBeri()' –

+0

我怎么加我使用该方法 –

0

最终,我解决了启发自nullPointerException文件的问题。感谢大家,所以我有线索发现问题。以前,我在2个地方声明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); 
}