Подтвердить что ты не робот

Android EditText onClickListener

Мне нужен EditText, который создает DatePicker при нажатии. Поэтому я пишу следующий код:

    mEditInit = (EditText) findViewById(R.id.date_init);
    mEditInit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showDialog(DATEINIT_DIALOG);
        }

    });

Но когда я нажимаю EditText, действие является типичным: курсор, ожидающий ввода текста, вместо этого показывает Диалог, который я хочу.

Любая идея?

Спасибо

4b9b3361

Ответ 1

Обновление автора: Ответ ниже, хотя и принятый в то время (во времена Eclair), сегодня в значительной степени неактуальен. Стандарты UX резко изменились с тех пор, как они были написаны. Сохраняя полноту и потому, что вы не можете удалить принятый ответ.

Появление диалога при фокусировке EditText кажется нестандартным интерфейсом. Считайте, что нормальная функция EditText полностью обойдена, поскольку вы даже не сможете вносить изменения в выбранную вами дату, потому что каждый раз, когда вы даете ей фокус, вы открываете этот диалог.

Поскольку вы используете его как TextView, почему бы просто не использовать фактический TextView вместе с кнопкой? Когда кнопка нажата, поднимите DatePicker и вызовите TextView.setText() с датой, отформатированной так, как вы хотите. Вы можете использовать onClickListener для кнопки, и он будет вести себя так, как вы ожидаете. Я считаю, что это сделает функцию более понятной для пользователей.

Ответ 2

Клавиатура, кажется, появляется, когда EditText получает фокус. Чтобы предотвратить это, установите значение focusable в false:

<EditText
    ...
    android:focusable="false"
    ... />

Такое поведение может различаться в зависимости от разных производителей в Android OS, но на устройства, которые я тестировал, я нашел, что этого достаточно. Если клавиатура все еще всплывает, использование подсказок вместо текста также помогает:

myEditText.setText("My text");    // instead of this...
myEditText.setHint("My text");    // try this

Как только вы это сделаете, ваш прослушиватель кликов будет работать по желанию:

myEditText.setOnClickListener(new OnClickListener() {...});

Ответ 3

Обычно требуется максимальная совместимость с нормальным поведением EditText.

Таким образом, вы не должны использовать android:focusable="false", поскольку, да, представление больше не будет фокусироваться, что выглядит плохо. Например, выведенный фон не будет показывать свое "нажатое" состояние.

Вместо этого вы должны сделать следующее:

myEditText.setInputType(InputType.TYPE_NULL);
myEditText.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // showMyDialog();
    }
});
myEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            // showMyDialog();
        }
    }
});

Установив тип ввода на TYPE_NULL, вы запретите всплывающую клавиатуру программного обеспечения.

Установив OnClickListener и OnFocusChangeListener, вы убедитесь, что ваше диалоговое окно всегда открывается, когда пользователь щелкает в поле EditText, как при получении фокуса (первый щелчок), так и при последующих нажатиях.

Просто настройка android:inputType="none" или setInputType(InputType.TYPE_NULL) не всегда достаточно. Для некоторых устройств вы также должны установить android:editable="false" в XML, хотя он устарел. Если он больше не работает, он просто будет проигнорирован (поскольку все атрибуты XML не поддерживаются).

Ответ 4

У меня была такая же проблема. Код в порядке, но убедитесь, что вы изменяете значение параметра EditText на false.

<EditText
android:id="@+id/date"
android:focusable="false"/>

Я надеюсь, что это поможет любому, у кого была подобная проблема!

Ответ 5

Вот решение, которое я реализовал

mPickDate.setOnKeyListener(new View.OnKeyListener() {

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        showDialog(DATE_DIALOG_ID);
        return false;
    }
});

ИЛИ

mPickDate.setOnFocusChangeListener(new View.OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        showDialog(DATE_DIALOG_ID);

    }
});

См. различия самостоятельно. Проблема в том, что (например, RickNotFred сказал) TextView для отображения даты и редактирования с помощью DatePicker. TextEdit не используется для своей основной цели. Если вы хотите, чтобы DatePicker снова всплывал, вам нужно ввести delete (1-й случай) или фокус (2-й случай).

Луч

Ответ 6

IMHO Я не согласен с утверждением RickNotFred:

Появление диалогового окна при входе в EditText фокус кажется нестандартным интерфейс.

Отображение диалогового окна для редактирования даты, когда использование нажимает на EditText, очень похоже на значение по умолчанию, которое должно отображать клавиатуру или числовую клавиатуру. Тот факт, что дата отображается с помощью EditText, сигнализирует пользователю о том, что дата может быть изменена. Отображение даты в качестве нередактируемого TextView сигнализирует пользователю о том, что дата не может быть изменена.

Ответ 7

Следующее отлично работает для меня.

Сначала установите вход виджета для выбора даты в "none", чтобы предотвратить появление мягкой клавиатуры:

<EditText android:inputType="none" ... ></EditText>

Затем добавьте эти прослушиватели событий, чтобы отобразить диалоговое окно, содержащее средство выбора даты:

// Date picker
EditText dateEdit = (EditText) findViewById(R.id.date);
dateOfBirthEdit.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            showDialog(DIALOG_DATE_PICKER);
        }
        return false;
    }
});

dateEdit.setOnFocusChangeListener(new OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            showDialog(DIALOG_DATE_PICKER);
        } else {
            dismissDialog(DIALOG_DATE_PICKER);
        }
    }
});

Последнее. Чтобы убедиться, что введенные дни, месяцы или годы правильно скопированы из списка выбора даты, вызовите datePicker.clearFocus(), прежде чем извлекать значения, например, через getMonth().

Ответ 8

Хорошая тема. Хорошо, я сделал это. В файле XML:

<EditText
    ...
    android:editable="false"
    android:inputType="none" />

В Java-коде:

txtDay.setOnClickListener(onOnClickEvent);
txtDay.setOnFocusChangeListener(onFocusChangeEvent);

private View.OnClickListener onOnClickEvent = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        dpDialog.show();
    }
};
private View.OnFocusChangeListener onFocusChangeEvent = new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus)
            dpDialog.show();
    }
};

Ответ 9

Работа по умолчанию EditText: При первом нажатии он фокусируется, а при втором нажатии обрабатывает onClickListener, поэтому вам нужно отключить фокус. Затем сначала щелкните по кнопке onClickListener.

Для этого вам нужно добавить этот атрибут android:focusableInTouchMode="false" к вашему EditText. Что это!

Что-то вроде этого:

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="false"
        android:inputType="text" />

Ответ 10

Вот что сработало для меня

Установите для редактирования значение false

<EditText android:id="@+id/dob"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Date of Birth"
android:inputType="none"
android:editable="false"

/" >

Затем добавьте прослушиватель событий для OnFocusChange

private  View.OnFocusChangeListener onFocusChangeDOB= new View.OnFocusChangeListener() {

@Override
 public void onFocusChange(View v, boolean hasFocus) {
   if (hasFocus){
     showDialog(DATE_DIALOG_ID);
   }
 }
};

Ответ 11

Как предложил Диллон Кернс, настройка фокуса на фальшивые работы прекрасна. Но если ваша цель - отменить клавиатуру при нажатии на EditText, вы можете использовать:

mEditText.setInputType(0);

Ответ 12

Почему никто не упомянул setOnTouchListener? С помощью setOnTouchListener легко и правильно, и просто верните true, если слушатель потребляет событие, иначе false.

Ответ 13

Это работает для меня:

mEditInit = (EditText) findViewById(R.id.date_init);
mEditInit.setKeyListener(null);
mEditInit.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if(hasFocus)
            {
                mEditInit.callOnClick();
            }
        }
    });
mEditInit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showDialog(DATEINIT_DIALOG);
    }

});