ACTUALIZACIÓNBotón de Android: cómo establecer enfocable en verdadero y aún aceptar OnClick oyente al primer clic?
He resuelto el problema mediante la eliminación pulsando las dos líneas enfocable del estilo de botón y utilizando el manejador de evento de clic para llamar requestFocusFromTouch();
Por desgracia me quedo con un tema que requestFocusFromTouch () enfoca el botón equivocado. Siempre enfoca el primer botón, no el botón al que llamo el método. ¿Es esto un error de Android o un comportamiento esperado y qué puedo hacer para trabajar?
El código se verá así para el evento de clic
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_home:
Intent i = new Intent(this, QuizMenu.class);
startActivity(i);
v.requestFocusFromTouch();
break;
case R.id.btn_support:
Intent i1 = new Intent(this, Support.class);
startActivity(i1);
v.requestFocusFromTouch();
View btnSupport = findViewById(R.id.btn_support);
btnSupport.setSelected(true);
btnSupport.requestFocusFromTouch();
break;
// More buttons go here (if any) ...
}
}
FIN DE ACTUALIZACIÓN
tengo un botón de androide que tiene el siguiente estilo
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MnuBtnStyle">
<item name="android:ellipsize">marquee</item>
<item name="android:scrollHorizontally">true</item>
<item name="android:focusable">true</item>
<item name="android:focusableInTouchMode">true</item>
<item name="android:singleLine">true</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_marginTop">1dip</item>
<item name="android:layout_marginBottom">1dip</item>
<item name="android:textSize">10dp</item>
<item name="android:layout_weight">1</item>
<item name="android:textColor">#00FF00</item>
<item name="android:typeface">monospace</item>
</style>
</resources>
tengo una en clic oyente que se parece a esto
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_home:
Intent i = new Intent(this, HomeScreen.class);
startActivity(i);
break;
// More buttons go here ...
}
}
Tengo una imagen en el botón y el selector se parece a esto
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/ic_tab_home_pressed" /> <!-- pressed -->
<item android:state_focused="true"
android:drawable="@drawable/ic_tab_home_pressed" /> <!-- pressed -->
<item android:drawable="@drawable/ic_tab_home_unpressed" /> <!-- default/unchecked -->
</selector>
El diseño que utiliza el botón y el botón se parece a esto
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:id="@+id/top_menu_bar"
android:layout_marginTop="2dip"
android:padding="0dip"
android:background="@android:drawable/bottom_bar"
android:layout_alignParentTop="true"
android:gravity="top"
android:layout_height="@dimen/menu_bar_height"
android:layout_width="fill_parent">
<Button
android:id="@+id/btn_home"
android:text="@string/btn_home"
android:drawableTop="@drawable/home_button"
style="@style/MnuBtnStyle"
/>
...
hay otros botones y este diseño está actuando como una barra de menú superior que se incluye en cualquier diseño que lo necesite.
El evento onClick para el botón solo se activa al segundo clic del botón debido a las líneas enfocables.
<item name="android:focusable">true</item>
<item name="android:focusableInTouchMode">true</item>
Los primeros ajustes de metrónomo se centran en el botón a continuación, la segunda posición activa el detector de eventos onClick tengo que combinar los dos juntos para que los primeros conjuntos se centran clic y dispara el detector de eventos onClick. Se puede hacer esto?
Si quito las dos líneas enfocable los botones se comportan normalmente, pero quiero demostrar que el botón se centra y quiero que el texto de desplazamiento en el interior del botón que <item name="android:ellipsize">marquee</item>
me da
Cualquier idea muy apreciada
Gran idea, gracias. Simplemente no parece poder verificar isTouchMode.Estoy recibiendo errores de compilación – jamesc
Finalmente conseguí todo conectado, pero la solución tiene efectos no deseados. ¡Recibo millones de clics! El evento onFocusedCange se llama millones de veces. Podría agregar una bandera para llamar solo al código para comenzar la actividad una vez, pero realmente necesito una mejor solución ya que este evento podría ser bastante costoso en términos de rendimiento. ¿Algunas ideas? – jamesc
No realmente: como ha observado, el problema es que el primer toque lo pone en modo táctil Y lo enfoca. Si no fuera enfocable, lo pondría en modo táctil y haría clic inmediatamente, pero el requisito de enfoque requiere el paso adicional. Puede necesitar la bandera. – Femi