Estoy agregando comandos de voz a una aplicación ya existente y totalmente funcional. La interacción de voz parece funcionar bien. Puedo decir el comando, obtengo el resultado correcto e incluso obtengo el botón correcto, qué interacción de clic deseo simular usando la voz.

Mi problema es que performClick() y callOnClick() parecen ni siquiera ser llamados. Cada botón tiene su escucha (los clics manuales funcionan).

Como nota al margen: estoy llamando a los métodos de clic fuera de mi actividad. ¿Es eso un problema?

¿Cómo consigo estos métodos para activar realmente el onClick de mis botones?

PD: Tal vez algunas sugerencias serían usar las funciones directamente en lugar de usar el evento de clic. El primer punto, por qué no quiero hacer eso, es que quiero evitar el código duplicado o una reestructuración del código, y en segundo lugar, me gustaría mantener mi reconocimiento de voz lejos de estar conectado demasiado profundamente al código comportándome como un usuario simple (de ahí el clic programático).

Editar:

Básicamente no estoy haciendo nada más que:

Desde mi actividad principal, llamo a mi clase auxiliar:

util = new MainVoiceUtil(this, getLayoutInflater(), viewgroup);

viewgroup aquí no está relacionado con este tema. En MainVoiceUtil dice:

public MainVoiceUtil(Context context, LayoutInflater inflater, Viewgroup viewgroup)
{
   super(context);
   ...
}

MainVoiceUtil extiende VoiceUtil, que contiene un método onResult, que contiene el performClick. context se establece en el constructor de VoiceUtil. Ver:

@Override
public void onResult(AIResponse result)
{
   View button = ((Activity) context).findViewById(buttonId);
   button.performClick();
}

Gracias a las salidas de registro, sé que tengo el botón correcto. Esto significa que sé que estoy ingresando el método onResult. Se muestran todas las salidas de registro, solo este clic no parece ejecutarse.

1
KJaeg 26 feb. 2018 a las 14:44

4 respuestas

La mejor respuesta

Resultó que estaba llamando al método equivocado. La actividad principal era anular un método llamado onButtonClick. Este estaba decidiendo por ID, en qué botón se hizo clic. Pensé que se llamaba de todos modos tan pronto como se activó un onClick, lo cual no parece ser el caso. Parece que va a la inversa. Al hacer clic manualmente, ambos parecen trabajar juntos. Pero en mi caso tuve que pasar de button.performClick() para llamar a onButtonClick(buttonId) en su lugar.

No estaba familiarizado con esto, de ahí mi confusión. Así que esto fue más bien un malentendido específico del proyecto.

0
KJaeg 27 feb. 2018 a las 11:26

Debe configurar clickListener para esa vista

View button = ((Activity) context).findViewById(buttonId);

    button.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            // implement your logic
        }
    });

button.performClick();
-1
Mitesh Machhoya 26 feb. 2018 a las 11:54

En lugar de usar Actividad, intenta pasar tu actividad. No es el contexto.

Button button =(Button) (youractivity).findViewById(buttonId);//YourActivity.this
button.performClick();

Esto puede ayudar.

0
Jyoti JK 26 feb. 2018 a las 12:11

view.performClick() funcionó bien.
Asegúrese de encontrar view y agregar clicklisterner antes de llamar a esta función.

-1
ManmeetP 26 feb. 2018 a las 12:19