2011-08-07 8 views
8

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

Respuesta

3

Es posible que necesite usar un OnFocusChangeListener y luego verifique si el evento de enfoque ocurrió cuando la pantalla estaba en modo táctil: si lo hizo, entonces fue un clic del usuario; de lo contrario, era del trackball/trackpad.

+0

Gran idea, gracias. Simplemente no parece poder verificar isTouchMode.Estoy recibiendo errores de compilación – jamesc

+0

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

+0

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

4

que puede hacer como esto en onClick(View v):

..... 
v.setFocusableInTouchMode(true); 
v.requestFocus(); 
v.setFocusableInTouchMode(false); 
.....//the others 

así, v obtiene foco y se puede hacer algo a través de onClick()setFocusableInTouchMode(false), puede aceptar onClick al primer toque.

Cuestiones relacionadas