He hecho una prueba muy simple aplicación con una actividad y una disposición. El onClick no desencadenar la primera vez que se pulsa, como debe ser.

La actividad:

package com.example.mytest;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final EditText ed1 = (EditText) findViewById(R.id.editText1);

        ed1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                //TODO Auto-generated method stub

                Toast.makeText(getApplicationContext(), "1", Toast.LENGTH_LONG)
                        .show();

            }

        });
    }

}

El diseño:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/editText1"
        android:ems="10" />

</RelativeLayout>

Si se ejecuta esta aplicación, y haga clic en el segundo editText y luego regresar a la primera, no va a desencadenar la onClick. Usted puede mantener la selección de ida y vuelta y no va a desencadenar la onClick a todos. Necesito esta funcionalidad básica, pero no he sido capaz de pensar en una manera de conseguir que funcione. Ideas?

Aviso

He intentado todos los métodos recomendados en mi nivel de API de 16 dispositivo físico y mi nivel de API 8 emulador, pero me da el mismo problema.

Aclaración

Cuando editText1 se concentra y se hace clic en, a continuación, el onClick método de incendios. Si editText2 se concentra y, a continuación, editText1 es hacer clic en él, no fuego. Gran problema.

  • ¿qué es este::xmlns:herramientas=»schemas.android.com/tools«
  • r u mostrar sólo tostadas ?? trate de sysout.. shme veces brindis r no puede que la pantalla de b, porque si la clave de Bord..
  • Traté de system.out, pero funciona exactamente igual que el brindis hizo.
  • Las herramientas de espacio de nombres para el nuevo (r20) el desarrollador de la herramienta de la cadena. Es parte de la plantilla de proyecto aplicación.
InformationsquelleAutor EGHDK | 2012-08-03

8 Comentarios

  1. 183

    Resumen, cuando un usuario interactúa con cualquier componente de interfaz de usuario los diferentes detectores de llama en un top-down de la orden. Si uno de los de mayor prioridad a los oyentes «consume el evento», a continuación, la parte inferior de los oyentes no se llama.

    En su caso, estas tres oyentes son llamados en orden:

    1. OnTouchListener
    2. OnFocusChangeListener
    3. OnClickListener

    La primera vez que el usuario toca un EditText que recibe el foco, de modo que el usuario puede escribir. La acción se consume aquí. Para ello el menor prioridad OnClickListener no es llamado. Cada una de las sucesivas touch no cambiar el enfoque para estos eventos llegaran a la OnClickListener.

    Botones (y otros componentes) no recibe el foco de un evento de toque, es por eso que el OnClickListener se llama cada vez.

    Básicamente, usted tiene tres opciones:

    1. Implementar un OnTouchListener por sí mismo:

      ed1.setOnTouchListener(new OnTouchListener() {
          @Override
          public boolean onTouch(View v, MotionEvent event) {
              if(MotionEvent.ACTION_UP == event.getAction())
                  editTextClicked(); //Instead of your Toast
              return false;
          }
      });

      Se ejecutará cada vez que el EditText es tocado. Observe que el oyente devuelve false, esto permite que el evento empieza a gotear hacia abajo a la incorporada en el OnFocusChangeListener que cambia el foco de manera que el usuario puede escribir en el EditText.

    2. Implementar un OnFocusChangeListener junto con el OnClickListener:

      ed1.setOnFocusChangeListener(new OnFocusChangeListener() {
          @Override
          public void onFocusChange(View v, boolean hasFocus) {
              if(hasFocus)
                  editTextClicked(); //Instead of your Toast
          }
      });

      Esta escucha coge el primer evento de toque cuando cambie el foco, mientras que su OnClickListener capturas de cada evento.

    3. (Esta no es una respuesta válida aquí, pero es un buen truco para saber). Establecer la seleccionable atributo false en el XML:

      android:focusable="false"

      Ahora el OnClickListener voluntad de fuego cada vez que se hace clic. Pero esto hace que el EditText inútil, ya que el usuario no puede introducir cualquier texto…

    Nota:

    getApplicationContext() puede crear pérdidas de memoria. Un buen hábito es evitar el uso de ella, a menos que sea absolutamente necesario. Usted puede utilizar con seguridad v.getContext() lugar.

    Espero que ayude!

    • muy bonita la explicación…!!
    • #2 fue útil, en mi caso de uso – necesitaba tener mi costumbre relativa botón diseño de la manija de ambos onClick y onBlur. Tenga en cuenta que si alguien tiene este caso de uso, su onClick no tendrá que hacer nada, porque el onFocusChange se encarga tanto de la onClick (cuando concentroatención = true) y onBlur (cuando concentroatención = false). Y si son con el mismo tipo de vista, y asegúrese de establecer android:focusable="true" y android:focusableInTouchMode="true". Gracias, Sam.
    • Tengo un TextView con android:textIsSelectable="true". Entonces, ¿cuál es la solución si tengo que escuchar a OnClick() evento y también, el usuario puede seleccionar el texto dentro de la TextView.
    • #3 es la mejor solución!
    • Btw, @Sam hacer su recuerdo haber visto esto en algún lugar de los documentos o es a partir de la experiencia y tal vez la depuración?
    • Esto lo aprendí de la manera difícil a través de ensayo y error, a continuación, la depuración.

  2. 5

    hacer de edición de texto, puede hacer clic..
    En XML android:clickable="true"
    o en el código

    ed1.setClickable(true);

    a continuación, hacer

    ed1.setOnClickListener(new OnClickListener() {
    
        @Override
        public void onClick(View v) {
          Toast.makeText(getBaseContext(), "1",Toast.LENGTH_SHORT).show();
        }
      });
    • Nope. Sigue recibiendo el mismo problema.
    • ¿qué es este–> xmlns:herramientas=»schemas.android.com/tools» y quitar la final de la edición de texto ..
    • Eso es lo que muestran es que por defecto cuando se crea un diseño nuevo en eclipse. También, he quitado final y sigo teniendo el mismo problema.
    • <?xml version=»1.0″ encoding=»utf-8″?> <LinearLayout xmlns:android=»schemas.android.com/apk/res/android» android:layout_width=»fill_parent» android:layout_height=»fill_parent» android:orientación=»vertical» > <TextView android:layout_width=»fill_parent» android:layout_height=»wrap_content» android:text=»@string/hola» /> </LinearLayout> Por defecto las cosas..
    • No para la mía. Que xml a partir de un proyecto nuevo.
    • setClickable(true) era mi problema. No todas las opiniones establece que a true de forma predeterminada. Yo no estaba usando un botón, yo estaba usando un punto de Vista que no está normalmente se puede hacer clic.
    • que xmlns:tools no afecta a la implementación del comportamiento, consulte tools.android.com/tech-docs/tools-attributes y tools.android.com/tips/layout-designtime-attributes
    • hace que cualquier punto de vista se puede hacer clic, ver código.

  3. 4

    Probablemente soy demasiado tarde a la fiesta, pero aquí es un código cortada que corrige el problema con onClick() no se llama:

    ed1.setOnTouchListener(new OnTouchListener() {
    
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_UP && !v.hasFocus()) {
                //onClick() is not called when the EditText doesn't have focus,
                //onFocusChange() is called instead, which might have a different 
                //meaning. This condition calls onClick() when click was performed
                //but wasn't reported. Condition can be extended for v.isClickable()
                //or v.isEnabled() if needed. Returning false means that everything
                //else behaves as before.
                v.performClick();
            }
            return false;
        }
    });
  4. 2

    Esto sucede porque el primer toque recibe el foco en la vista. El siguiente toque desencadena el clic.

    Si usted está inflando el punto de vista de forma dinámica, hacer esto:

    android:clickable="true"
    android:focusable="false"
    android:focusableInTouchMode="false"

    Si esto no funciona, pruebe a aplicar en la vista principal así.

  5. 0
    public class TestProject extends Activity implements OnClickListener {
    TextView txtmsg;
    EditText ed1, ed2;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        txtmsg = (TextView) findViewById(R.id.txtmsg);
        ed1 = (EditText) findViewById(R.id.edt1);
        ed2 = (EditText) findViewById(R.id.edt2);
    
        ed1.setOnClickListener(this);
        ed2.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View v) {
    
    
        if(v==ed1){
            txtmsg.setText("1");
            Toast.makeText(this, "first",Toast.LENGTH_SHORT).show();
        }
        if(v==ed2){
            txtmsg.setText("2");
            Toast.makeText(this, "second",Toast.LENGTH_SHORT).show();
        }
    
    }

    }

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <EditText
            android:id="@+id/edt1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:ems="10" />
    
        <EditText
            android:id="@+id/edt2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/edt1"
            android:layout_marginTop="14dp"
            android:ems="10" />
    
        <TextView
            android:id="@+id/txtmsg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignRight="@+id/edt2"
            android:layout_below="@+id/edt2"
            android:layout_marginRight="22dp"
            android:layout_marginTop="160dp"
            android:textAppearance="?android:attr/textAppearanceLarge" />
    
    </RelativeLayout>
  6. 0

    Me tomé un minuto para averiguar esto una vez, cuando esto me pasó a mí. Mi ImageButton con un setOnClickListener y onClick no parecía fuego, y entonces me di cuenta de que en realidad estaba debajo de otro elemento en mi xml de diseño, así que me volví a este:

     <RelativeLayout>
         <ImageButton>
         <LinearLayout></LinearLayout>
     </RelativeLayout>

    a esto:

     <RelativeLayout>
         <LinearLayout></LinearLayout>
         <ImageButton>
     </RelativeLayout>

    y de repente el ImageButton no se solapa con el de otros planos, ya que ahora fue añadido más tarde para los padres de diseño y ahora estaba en la parte superior y funciona todo el tiempo. Buena suerte, siempre es divertido cuando las cosas básicas de repente deja de funcionar

  7. 0

    Evitar el uso de un FocusChangeListener ya que se comportan de forma errática cuando usted realmente no lo necesita (por ejemplo. cuando se introduce una actividad). Acaba de establecer un OnTouchListener junto con su OnClickListener como este:

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                view.requestFocus();
                break;
        }
        return false;
    }

    Esto hará que el EditText para recibir el foco en la primera, y su onClick para que funcione correctamente la primera vez.

  8. 0

    Su la forma más simple para trabajar con selector de fecha.

    private DatePickerDialog datePickerDialog;
    EditText etJoiningDate;
    etJoiningDate=(EditText)findViewById(R.id.etJoiningDate);
    
    etJoiningDate.setOnTouchListener(new View.OnTouchListener() {
    
        @Override
        public boolean onTouch(View v, MotionEvent event) {
    
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
    
                    final Calendar cldr = Calendar.getInstance();
                    int day = cldr.get(Calendar.DAY_OF_MONTH);
                    int month = cldr.get(Calendar.MONTH);
                    int year = cldr.get(Calendar.YEAR);
                    //date picker dialog
                    datePickerDialog = new DatePickerDialog(TestActivity.this,
                            new DatePickerDialog.OnDateSetListener() {
                                @Override
                                public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                                    etJoiningDate.setText(dayOfMonth + "/" + (monthOfYear + 1) + "/" + year);
                                }
                            }, year, month, day);
                    datePickerDialog.show();
    
                    break;
            }
    
    
            return false;
        }
    
    
    });

Dejar respuesta

Please enter your comment!
Please enter your name here