2012-05-19 4 views
21

Es necesario disponer de un texto con un estirable de la izquierda y quiero para ejecutar código cuando el usuario hace clic/toca la imagen (sólo la imagen, no el texto), por lo que utilizó LinearLayout con TextView y ImageView que se puede hacer clic y se inicia un evento onClick. El analizador XML me sugiere reemplazar esto con un TextViewcon un compuesto estirable, que atraería lo mismo con muchas menos líneas de XML .. Mi pregunta es "¿Puedo especificar Quiero manejar un evento de clic sólo en el dibujo del TextView y no en el TextView sí mismo? He visto algunas soluciones que implica escribir tu propia extensión de TextView, pero solo estoy interesado en poder hacerlo dentro del diseño de recursos, si es posible, de lo contrario voy a seguir el siguiente XML código:Implementar onClick sólo para un compuesto de Vista de Texto estirable

<LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:orientation="horizontal" > 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:gravity="bottom" 
      android:paddingTop="10dp" 
      android:paddingLeft="10dp" 
      android:paddingRight="10dp" 
      android:text="@string/home_feedback_title" 
      android:textColor="@android:color/primary_text_dark" 
      android:textStyle="bold" 
      android:paddingBottom="4dp"/> 


     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@drawable/action_feedback" 
      android:clickable="true" 
      android:onClick="onClickFeedback" 
      android:contentDescription="@string/action_feedback_description"/> 
</LinearLayout> 

Respuesta

6

Puede ir en cualquier dirección. Sin embargo, usar el compuesto dibujable es más rápido porque estaba destinado a ser una optimización. Utiliza menos memoria RAM porque reduce 3 vistas en 1 y su diseño es más rápido porque pierde 1 profundidad.

Si yo fuera tú me gustaría considerar un paso atrás para ver si el texto y la imagen de interceptar el toque de hacer cualquier acción que sea posiblemente una buena cosa. En general, tener una región táctil más grande hace que sea más fácil presionar. Algunos usuarios pueden estar inclinados a tocar el texto en lugar de la imagen.

Por último, si va por esa ruta de fusionar el 2, podría considerar usar un Button en lugar de un TextView. Puede darle estilo al botón para que no tenga el rectángulo a su alrededor. Lo llaman un botón sin bordes. Es agradable porque tienen información visual que ha hecho clic en un elemento accionable donde como ImageView o TextView normalmente no son procesables.

How to Create Borderless Buttons in Android

30

Su muy simple. Digamos que tiene un dibujante en el lado izquierdo de su TextView 'txtview'. Lo siguiente hará el truco.

TextView txtview = (TextView) findViewById(R.id.txtview); 
txtview.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(event.getAction() == MotionEvent.ACTION_UP) { 
      if(event.getRawX() <= txtview.getTotalPaddingLeft()) { 
       // your action for drawable click event 

      return true; 
      } 
     } 
     return true; 
    } 
}); 

Si desea para el cambio dibujable bien la sentencia if para:

if(event.getRawX() >= txtview.getRight() - txtview.getTotalPaddingRight()) 

Del mismo modo, puede hacerlo para todos los dibujables compuestos.

txtview.getTotalPaddingTop(); 
txtview.getTotalPaddingBottom(); 

llamada Este método devuelve todo el relleno de ese lado incluyendo cualquier dibujables. Se puede utilizar esta incluso para TextView, etc. Botón

Haga clic here de referencia desde el sitio de desarrolladores de Android.

+0

Parece más seguro usar el diseño original ... – deathangel908

2

@ La respuesta de Vishnuvathsan es casi perfecta, pero getRaw() devuelve una posición x absoluta del punto de contacto. Si la vista de texto no se encuentra en el borde izquierdo de la vista, debe compararla con la posición absoluta de la vista de texto utilizando getLocationOnScreen. El siguiente código es un ejemplo para verificar tanto el toque dibujado a la izquierda como el toque a la derecha.

textView.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(event.getAction() == MotionEvent.ACTION_UP) { 
      int[] textLocation = new int[2]; 
      textView.getLocationOnScreen(textLocation); 

      if(event.getRawX() <= textLocation[0] + textView.getTotalPaddingLeft()) { 

       //Left drawable was tapped. 

       return true; 
      }` 


      if(event.getRawX() >= textLocation[0] + textView.getWidth() - textView.getTotalPaddingRight()){ 

       //Right drawable was tapped. 

       return true; 
      } 
     } 
     return true; 
    } 
}); 
Cuestiones relacionadas