Jak zrobić coś po kliknięciu przez użytkownika na mój EditText

Mam EditText, który pokazuje czas. Po kliknięciu EditText chcę pokazać TimePickerDialog, więc ustawiam View.OnClickListener na mój EditText.

Ale OnClickListener zachowuje się dziwnie - dotykam EditText i pojawia się klawiatura programowa (której nie chcę). Gdy dotknę ponownie, OnClickListener.onClick() zostanie wywołane i pojawi się okno dialogowe.

Co zrobić, jeśli chcę, aby okno dialogowe pojawiło się natychmiast?

Author: Sufian, 2010-01-22

6 answers

W przeciwieństwie do większości innych elementów sterujących, EditText S są ustawiane na ostrość, gdy system jest w "trybie dotykowym". Zdarzenie pierwszego kliknięcia skupia kontrolkę, podczas gdy zdarzenie drugiego kliknięcia powoduje wywołanie OnClickListener. Jeśli wyłączysz ustawianie ostrości w trybie dotykowym za pomocą atrybutu widoku android:focusableInTouchMode, OnClickListener powinien zostać uruchomiony zgodnie z oczekiwaniami.

<EditText
        android:text="@+id/EditText01"
        android:id="@+id/EditText01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="false" />
 120
Author: Kai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-28 21:03:04

Innym rozwiązaniem jest użycie ontouchlistener:

edittext.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(MotionEvent.ACTION_UP == event.getAction()) {
            mQuaternion_1.setText("" + mQ1);
        }

        return true; // return is important...
    }
});

Jeśli zwróci true zdarzenie jest obsługiwane i klawiatura nie będzie wyskakiwać. Jeśli chcesz, aby klawiatura nadal wyskakiwała i klikała Rejestracja, musisz ją zwrócić false.

 53
Author: Warpzit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-29 07:55:10

Wygląda na to, że nie chcesz, aby użytkownik faktycznie mógł wpisywać EditText. Chcesz tylko, aby mogli wybrać czas za pomocą time picker. Więc dlaczego nie wystarczy przycisk, który wyskakuje TimePickerDialog? Możesz wyświetlić czas, który został wybrany w widoku tekstowym.

LUB możesz po prostu zastąpić Widok EditText widokiem TimePicker (Nie okno dialogowe, tylko zwykły widok).

 3
Author: Mark B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-22 17:23:11

Rozwiązałem to za pomocą dostosowanego przycisku, takiego jak ten:

<Button
        android:id="@+id/btTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:text="test"
        android:textSize="20dp"
        android:background="@android:drawable/edit_text" />
 2
Author: fhucho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-28 21:03:44

Zamiast Touch Listener użyj Text Change Listener:

editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            //yourFunction();
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });
 2
Author: Kumar VL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-13 05:59:22

Jeśli dobrze rozumiem, potrzebujesz czegoś w rodzaju

<EditText android:text="@+id/EditText01" android:id="@+id/EditText01"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:clickable="true" android:inputType="none" />

Nie można edytować i klikać. Ustaw OnClickListener i gotowe. W teorii, w praktyce należy dodać zbyt

android:editable="false" 
Który jest przestarzały, ale robi sztuczkę.
 1
Author: Diego Torres Milano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-22 20:02:45