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?
3 respuestas
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()
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"/>
Aquí hay un par de cosas interesantes en juego. Y esos son dos enfoques diferentes para el manejo de eventos de clic de TalkBack *.
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.
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.
Nuevas preguntas
android
Android es el sistema operativo móvil de Google, que se utiliza para programar o desarrollar dispositivos digitales (teléfonos inteligentes, tabletas, automóviles, televisores, ropa, vidrio, IoT). Para temas relacionados con Android, use etiquetas específicas de Android, tales como intención de Android, actividad de Android, adaptador de Android, etc. Para preguntas que no sean de desarrollo o programación, pero relacionadas con el marco de Android, use este enlace: https: // android.stackexchange.com.