編集テキストをクリックしてダイアログの日付を表示したいので、試してみます
mDateDisplay = (EditText) findViewById(R.id.dateDisplay);
mDateDisplay.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
showDialog(DATE_DIALOG_ID);
}
}
});
MDateDisplayがボタンであるかどうかをダイアログに表示します
しかし、edittextを使用したい
私は何をすべきか?
これを使って:
_mDateDisplay.setClickable(true);
mDateDisplay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog(DATE_DIALOG_ID);
}
});
_
または、XMLの_Android:onClick
_属性を使用して、Activityサブクラスのクリック処理関数を指すこともできます。
(もちろん、最近では、ほとんどの人が互換性ライブラリを使用している場合、showDialog()
を呼び出すのではなく、ダイアログフラグメントを作成して表示することをお勧めしますが、考え方は同じです。)
OnClickListenerイベントを使用してダイアログボックスを処理できますが、このようにxmlファイルでEditTextのAndroid:focusableInTouchMode
を無効にした後です。例-Android:focusableInTouchMode="false"
。
EditTextが最初にタッチされると、フォーカスイベントが呼び出され、2回目にタッチされると、クリックイベントが呼び出されるため、最初にフォーカスイベントを無効にする必要があります。
私が使用したのと同じことのために:
sel_date.setClickable(true);
sel_date.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
showDialog(DEFAULTDATESELECTOR_ID);
}
});
そして、選択した日付をEditTextの値として設定する場合:
private DateSlider.OnDateSetListener mDateSetListener =
new DateSlider.OnDateSetListener() {
public void onDateSet(DateSlider view, Calendar selectedDate) {
// update the dateText view with the corresponding date
sel_date.setText(String.format("%te-%tB-%tY", selectedDate, selectedDate, selectedDate).trim());
}
};
Android: http://blog.codeus.net/dateslider-1-0-an-alternative-datepicker-for-Android)のカスタム日付ピッカーからコードを編集しました/
ButtonをEditTextに置き換えて、上記のコードと同じことを行うことができます。
EditText
がフォーカスを取得すると、キーボードがポップアップするように見えます。これを防ぐには、focusableをfalseに設定します。
<EditText
...
Android:focusable="false"
... />
編集済み
次のコードを確認してください。
public class Main extends Activity {
EditText et1,et2;
static final int DATE_DIALOG_ID = 0;
static final int DATE_DIALOG_ID1 = 1;
private int mYear;
private int mMonth;
private int mDay;
private int mYear1;
private int mMonth1;
private int mDay1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et1=(EditText)findViewById(R.id.EditText01);
et2=(EditText)findViewById(R.id.EditText02);
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
et1.setText("month/year");
et2.setText("month/year");
et1.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
showDialog(DATE_DIALOG_ID);
return false;
}
});
et2.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
showDialog(DATE_DIALOG_ID1);
return false;
}
});
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:
return new DatePickerDialog(this, mDateSetListener, mYear, mMonth,
mDay);
case DATE_DIALOG_ID1:
return new DatePickerDialog(this, mDateSetListener1, mYear1, mMonth1,
mDay1);
}
return null;
}
// updates the date in the TextView
private void updateDisplay() {
et1.setText(new StringBuilder()
// Month is 0 based so add 1
.append(mMonth + 1).append("-").append(mYear));
}
private void updateDisplay1() {
et2.setText(new StringBuilder()
// Month is 0 based so add 1
.append(mMonth1 + 1).append("-").append(mYear1));
}
// the callback received when the user "sets" the date in the dialog
private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
updateDisplay();
}
};
private DatePickerDialog.OnDateSetListener mDateSetListener1 = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year1, int monthOfYear1,
int dayOfMonth1) {
// TODO Auto-generated method stub
mYear1 = year1;
mMonth1 = monthOfYear1;
mDay1 = dayOfMonth1;
updateDisplay1();
}
};
}
私も同様の問題に直面しました。簡単にするために、それを解決するために、私は次のコードを使用しました:
editText.setClickable(true);
editText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// showDialog
}
});
XMLの場合:
<EditText
...
Android:focusableInTouchMode="false"
/>
そのため、ユーザーはEditTextを編集できず、クリックするだけで済みます。
これは、必要な出力を提供する完璧なコードです。
public class TextView_Calendar extends Activity {
EditText et1,et2;
static final int DATE_DIALOG_ID = 0;
private int mYear;
private int mMonth;
private int mDay;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et1=(EditText)findViewById(R.id.et1);
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
et1.setText("month/year");
et1.setOnTouchListener(new OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
showDialog(DATE_DIALOG_ID);
return false;
}
});
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:
return new DatePickerDialog(this, mDateSetListener, mYear, mMonth, mDay);
}
return null;
}
// updates the date in the TextView
private void updateDisplay() {
et1.setText(new StringBuilder()
// Month is 0 based so add 1
.append(mDay).append("-").append(mMonth + 1).append("-").append(mYear));
}
// the callback received when the user "sets" the date in the dialog
private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
updateDisplay();
}
};
}
私はそれをonFocusChangeListener
で次のように行いました。
mCompleteByEditText = (EditText) findViewById(R.id.completion);
mCompleteByEditText
.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
DialogFragment newFragment = new TimePickerFragment();
newFragment.show(getSupportFragmentManager(),
"timePicker");
}
}
});
hasFocus
変数は、現在のEditText
にフォーカスがあるかどうかを制御します。