2017-03-02 23 views
1

私はDatePickerDialogを表示するために多くのedittextを持っていますので、メソッドとedittextをパラメータとして作成します。次にJavaは内部クラスからアクセスするときにパラメータが最終的であると述べました。edittextはfinalと宣言され、settextは動作しません。

しかし、私は、アプリケーションを実行すると、それは私が編集のテキストをよく実行するようにしない別のコードを持っているので、最終的にedittextが問題であると思うedittext.settext()で停止しました。

この

はコードです:

 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; 

状態i n側のonCreate:クリックで

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

EDITTEXT:あなたはEditTextが同じActivityであることを言ったので

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

.... 
+0

あなたの関数 'setDateTanggalBeri()'同じ活性ですか、あなたのEditTextの初期化で断片化しますか? –

+0

はいそれは同じアクティビティにあります。 EditTextの初期化を別のメソッドの中に入れ、それをonCreateで呼び出します。 –

+0

エラーメッセージを挿入できますか? –

答えて

3

、私はそれクラスのプライベートオブジェクト作りをお勧めします。

例:

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

この方法を行うには、EditTextfinalである必要はなく、setDateTanggalBeri()方法は同じように動作することができます。

私はそれが役に立ちそうです。

+0

しかし、私は複数のedittextのメソッドを呼び出すことができるように、パラメータとしてeditTextを作成する必要があります。私はdatepickerdialogを表示するために30のeditTextを持っています。 –

+0

私はあなたの問題を理解しています。覚えておくためにはここのドキュメントを読ませてください。しかし、EditTextを拡張する**クラスを作成し、そのメソッドをそこに実装して、 'editTanggal.setDateTanggalBeri()'を使用してください。 –

+0

私は方法を使用する –

0

最終的に、私はnullPointerExceptionドキュメントに触発された問題を解決します。皆さんありがとうございましたので、私はこの問題を発見する手がかりを持っています。以前は、edittextをoncreateの外側ともう一度insideメソッドの2つの場所で宣言していました。メソッドredeclare内の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); 
} 
関連する問題