Tengo el siguiente archivo xml.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/linear_layout1"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:focusable="true"
        android:layout_margin="10dp"
        android:orientation="vertical">

        <TextView
            android:id="@+id/text1"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:text="first text"
            android:layout_margin="10dp"/>

        <TextView
            android:id="@+id/text2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="second text"
            android:layout_margin="10dp"/>

    </LinearLayout>

</LinearLayout>

He configurado un detector de clics para LinearLayout y TextView.

TextView textView1 = (TextView) findViewById(R.id.text1);
LinearLayout linearLayout = findViewById(R.id.linear_layout1);
linearLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(v.getContext(), "Linear layout clicked", Toast.LENGTH_SHORT).show();
                }
            });

textView1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(), "text view clicked", Toast.LENGTH_SHORT).show();
            }
        });

He hecho que LinearLayout sea enfocable para que en el modo talkback pueda obtener el enfoque de accesibilidad. Ahora, cuando lo toco dos veces, se llama el evento de clic de la vista de texto en lugar del diseño lineal.

¿Cómo puedo hacer que llame al oyente de clics del diseño lineal?

1
G B 20 ene. 2018 a las 13:34

3 respuestas

La mejor respuesta

Tuve el mismo problema y lo resolví creando una nueva Vista, que estaba extendiendo LinearLayout y en esta Vista he anulado el método onInterceptTouchEvent(). En este método se verifica si la Accesibilidad está activada y si se selecciona ViewGroup (LinearLayout). Si es así, devuelve verdadero e intercepta este evento.

public class AccessibleLinearLayout extends LinearLayout {

    public AccessibleLinearLayout(Context context) {
        super(context);
    }

    public AccessibleLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public AccessibleLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (((AccessibilityManager) getContext().getSystemService(Context.ACCESSIBILITY_SERVICE)).isEnabled() && isAccessibilityFocused()) {
            return true;
        }
        return super.onInterceptTouchEvent(ev);
    }
}

No estoy seguro si necesita marcar ((AccessibilityManager) getContext().getSystemService(Context.ACCESSIBILITY_SERVICE)).isEnabled() cuando verifica si isAccessibilityFocused()

3
dane123 1 may. 2018 a las 14:33

La altura y el ancho de TextView es un problema

Cambiar de

<TextView
  android:id="@+id/text1"
  android:layout_width="match_parent"
  android:layout_height="100dp"
  android:text="first text"
  android:layout_margin="10dp"/>

Para

<TextView
  android:id="@+id/text1"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="first text"
  android:layout_margin="10dp"/>
-2
Balu Sangem 20 ene. 2018 a las 10:47

Aquí hay un par de cosas interesantes en juego. Y esos son dos enfoques diferentes para el manejo de eventos de clic de TalkBack *.

  1. Old TalkBack pasa eventos diferentes de los eventos táctiles normales. En lugar de enviar un evento táctil físico, envía una solicitud para llamar "acciones de clic". Entonces, no, el clic no termina propagándose como un "clic" normal.

  2. TalkBack ahora se basa en las API de gestos para enviar eventos físicos reales. Estos eventos de clic físico artificial se envían al centro de la vista que TalkBack le ha enviado la acción de activación (la acción de doble clic).

El problema que tienes es que estos dos comportamientos van a romper UNA de las dos soluciones obvias. Ha utilizado una solución obvia (simplemente utilizando oyentes de clics múltiples y suponiendo que los eventos se pasan al nodo enfocado), y no ha funcionado, porque la combinación de tecnología que está utilizando es V2 (enviando un clic de hardware artificial). Sin embargo, si tuviera que instalar su aplicación en un dispositivo Samsung, es posible que obtenga el comportamiento que desea ... ¡pero eso no significa que funcione! :)

Debido a estos dos comportamientos diferentes, la única forma de hacer que esto funcione de manera universal (todas las versiones de TalkBack y Android) es anular una de las vistas AccessibilityDelegates (en realidad, potencialmente ambas vistas) e interceptar esos eventos. No permita que pasen al controlador predeterminado, que sería uno de los dos métodos descritos anteriormente. En su lugar, llama a la lógica que deseas llamar y pasa el respiradero a tu alrededor.

  • Nota: En realidad, probablemente depende más de la versión / fabricante del sistema operativo Android, pero no estoy en mi máquina de desarrollo en este momento, y lo creas o no, pero navegar por el código AOSP en un navegador web simplemente no va a suceder en 10 PM los domingos por la noche. Puedo actualizar esta respuesta con más detalles en una fecha posterior.
3
ChrisCM 22 ene. 2018 a las 03:10