para - manual de programacion android pdf
Implementar onClick solo para un dibujo de TextView compuesto (3)
Es muy sencillo. Digamos que tiene un dibujo en el lado izquierdo de su TextView ''txtview''. 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 quieres, por derecho, cambiar la instrucción if a:
if(event.getRawX() >= txtview.getRight() - txtview.getTotalPaddingRight())
Del mismo modo, puedes hacerlo para todos los dibujables compuestos.
txtview.getTotalPaddingTop();
txtview.getTotalPaddingBottom();
Esta llamada al método devuelve todo el relleno en ese lado, incluidos los elementos dibujables. Puedes usar esto incluso para TextView, Button, etc.
Haga clic here para referencia del sitio del desarrollador de Android.
Necesito tener un texto con un dibujo a la izquierda y quiero ejecutar algo de código cuando el usuario haga clic o toque la imagen (solo la imagen, no el texto), así que utilicé un LinearLayout con un TextView y un ImageView que es pulsable y lanza un evento onClick. El analizador XML me sugiere que reemplace esto con un TextView con un dibujable compuesto , que dibujaría lo mismo con muchas menos líneas de XML . Mi pregunta es "¿puedo especificar que quiero manejar un evento onClick solo en el dibujable del ¿TextView y no en TextView ? He visto algunas soluciones que implican escribir su propia extensión de TextView , pero solo me interesa poder hacerlo dentro del recurso de diseño, de ser posible, de lo contrario, mantendré lo siguiente Código XML :
<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>
La respuesta de getRaw()
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 comparar con la posición absoluta de la vista de texto utilizando getLocationOnScreen
. El código a continuación es un ejemplo para verificar el grifo extraíble izquierdo y el grifo dibujable derecho.
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;
}
});
Puedes ir en cualquier dirección. Sin embargo, usar el compuesto extraíble es más rápido porque estaba destinado a ser una optimización. Utiliza menos memoria RAM porque reduce 3 vistas a 1 y su diseño es más rápido porque pierde 1 profundidad.
Si fuera tú, consideraría dar un paso atrás para ver si tanto el texto como la imagen que interceptan el toque para realizar cualquier acción es posiblemente algo bueno. En general, tener una región táctil más grande hace que sea más fácil presionar. Algunos usuarios pueden estar realmente inclinados a tocar el texto en lugar de la imagen.
Por último, si TextView
esa ruta para fusionar las 2, tal vez quieras considerar usar un Button
lugar de un TextView
. Puede diseñar el botón para que no tenga el rectángulo alrededor. Lo llaman un botón sin bordes. Está bien porque obtienes información visual de que hiciste clic en un elemento accionable en el que, como ImageView
o TextView
normalmente no son procesables.