Возможно ли, что при нажатии кнопки edittext появится диалоговое сообщение?
Я хочу нажать кнопку edittext и показать дату диалога, чтобы попробовать
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
что мне делать?
Ответы
Ответ 1
Использовать этот:
mDateDisplay.setClickable(true);
mDateDisplay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog(DATE_DIALOG_ID);
}
});
Кроме того, вы можете использовать атрибут android:onClick
в XML, чтобы указать на функцию обработки кликов в вашем подклассе Activity.
(Конечно, в наши дни, когда почти все используют библиотеки совместимости, вы, вероятно, захотите создать и показать фрагмент диалога, а не вызывать showDialog()
, но идея та же.)
Ответ 2
Вы можете использовать событие OnClickListener для обработки диалогового окна, но после отключения android:focusableInTouchMode
EditText в XML файле, как это.
например - android:focusableInTouchMode="false"
.
Потому что, когда EditText сначала касается, он вызывает событие фокусировки, и при втором касании он вызывает событие click, поэтому сначала нужно отключить событие фокусировки.
Ответ 3
Для той же вещи, которую я использовал:
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());
}
};
Я редактировал код из Custom Date Picker в 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();
}
};
}
Ответ 4
У меня возникла аналогичная проблема. Чтобы быть простым, чтобы решить это, я использовал следующий код:
editText.setClickable(true);
editText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// showDialog
}
});
В XML:
<EditText
...
android:focusableInTouchMode="false"
/>
Итак, пользователь не смог отредактировать EditText, просто нажмите на него.
Ответ 5
Это идеальный код, который даст вам желаемый результат:
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();
}
};
}
Ответ 6
Я сделал это с помощью 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
фокус или нет.