web-dev-qa-db-fra.com

EditText dans TextInputLayout onclick nécessite 2 clics?! Android

J'essaie simplement d'avoir un onlick écouter sur un texte Edit dans un TextInputLayout. Cela fonctionne, mais je dois cliquer deux fois sur EditText pour qu'il se déclenche, je ne comprends pas pourquoi. Voici mon code:

xml:

  <Android.support.design.widget.TextInputLayout
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="10dp">

        <EditText
            Android:id="@+id/start_date"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"
            Android:ems="10"
            Android:hint="Starting Date*: "
            Android:inputType="textPersonName" />
    </Android.support.design.widget.TextInputLayout>

Auditeur:

   private void setListenners() {
        EditText startDate = (EditText) mView.findViewById(R.id.start_date);
        startDate.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.N)
            @Override
            public void onClick(View v) {
                Calendar mcurrentDate=Calendar.getInstance();
                int mYear = mcurrentDate.get(Calendar.YEAR);
                int mMonth = mcurrentDate.get(Calendar.MONTH);
                int mDay = mcurrentDate.get(Calendar.DAY_OF_MONTH);

                DatePickerDialog mDatePicker=new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() {
                    @Override
                    public void onDateSet(DatePicker datePicker, int year, int month, int day) {
                        Log.d("DEBUG", "year: " + year + " month: " + month + " day: " + day);
                    }
                },mYear, mMonth, mDay);
                mDatePicker.show();
            }
        });
    }
19
Rémi

Définissez l'attribut Android:focusableInTouchMode à false

Android:focusableInTouchMode="false"

dans votre edittext code xml.


Explication, à partir des documents, Android:focusableInTouchMode est:

Booléen qui contrôle si une vue peut prendre le focus en mode tactile. Si cela est vrai pour une vue, cette vue peut gagner le focus lorsque vous cliquez dessus et peut garder le focus si une autre vue est cliquée sur laquelle cet attribut n'a pas la valeur true.

et le EditText est vrai par défaut.

En d'autres termes: le premier clic fera que le edittext gagnera en focus et le second clic est celui qui déclenche le ClickListener. Vous devez donc désactiver la focalisation sur le toucher.

34
Atef Hares