android - onClick no activado en LinearLayout con el niño
android-linearlayout (13)
El problema puede deberse a la vista de texto que tiene android:layout_height="fill_parent"
en su diseño. Si eso no soluciona el problema, el problema puede ser el evento onClick (). El diseño lineal puede que nunca llame a OnClick () ya que es un diseño. Intente sobreescribir el detector de eventos onTouch () en su lugar.
Tengo un LinearLayout personalizado con un niño TextView más pequeño. Me gustaría poder hacer clic en el área no cubierta por TextView, por lo que establezco clickable = true y un onclicklistener en LinearLayout, pero onClick no se activa. Si configuro el oyente onclick en TextView, funciona como se esperaba ...
¿Alguien puede ayudar?
ar_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ar_item" android:layout_width="202dp"
android:layout_height="62dp" android:background="@drawable/bg_item_ar"
android:clickable="true">
<TextView android:id="@+id/ar_item_txt"
android:layout_width="164dp" android:layout_height="fill_parent"
android:paddingBottom="8dp" android:paddingLeft="8dp"
android:paddingTop="8dp" android:paddingRight="6dp" android:gravity="center"
android:background="#50000000" />
</LinearLayout>
Mi LinearLayout personalizado
public class ARView extends LinearLayout
{
public ARView(final Context context, String name, String id)
{
super(context);
getLayoutInflater().inflate(R.layout.ar_item, this ,true);
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.ar_item, null);
TextView textView = (TextView) findViewById(R.id.ar_item_txt);
textView.setText(name);
setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Toast t = Toast.makeText(context, "hey!", Toast.LENGTH_SHORT);
t.show();
}
});
}
}
La altura de TextView cubre todo el elemento principal (diseño completo) por lo que puede hacer clic en el espacio vacío pero no en el diseño. Intenta usar wrap_content para android: layout_height para tu TextView. Establecer oyente click para el diseño también.
No estás usando tu vista personalizada; estás usando un LinearLayout estándar. Tu etiqueta XML debe ser:
<com.yourcode.ARView ...> ... </com.yourcode.ARView>
para cada niño
android: duplicateParentState = "true"
Una cosa de la que debes asegurarte es que otra vista no se encuentra encima de la vista en la que intentas hacer clic. Esto es especialmente común en FrameLayouts (donde puede estar cubierto su LinearLayout sub) o con Layouts relativos puede haber olvidado actualizar esta línea:
android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered"
para que las vistas no llenen el mismo espacio
android:duplicateParentState="true"
no me ayudó.
Para hacer que su diseño se pueda hacer clic con sus elementos secundarios, debe agregar esta opción para cada elemento secundario :
android:clickable="false"
A continuación, haga clic en el control irá a Parent .
Si las vistas en cuestión son TextView
, es posible que deba establecerlas como focusable="false"
para que el primer clic no se utilice y se enfoque en la vista de texto.
Agregue los siguientes atributos a linearlayout. Los eventos Click que no sean manejados por las vistas secundarias se pasarán automáticamente a LinearLayout.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
...
android:focusable="true"
android:clickable="true">
<child/>
<child/>
</LinearLayout>
El android:duplicateParentState="true"
hizo que mi TextView parezca estar deshabilitado y no pueda recibir el evento click.
Todo lo que necesita es establecer TextView clickable="false"
. Por lo tanto, el evento click se enviará al diseño primario, y TextView aún puede reaccionar al evento táctil (con efecto dominó ).
Este no es su caso, pero tuve un problema similar con ViewGroup
. Después de una hora de buscar una solución, descubrí que configuré android:inputType
a TextView
dentro de mi ViewGroup
que estaba bloqueando el oyente ViewGroup
(no tengo idea de por qué)
No use
android:inputType
con TextView
Enfrenté el mismo problema y todos los atributos XML no funcionaron. No estoy seguro si esto sucede porque inflar y agregar las vistas por programación, pero así es como trabajé en torno al problema.
Tengo una clase que amplía LinearLayout, con un TextView y un ImageView. Después de inflar el diseño y obtener las vistas, asigné a las vistas secundarias un OnClickListener, cuando se presiona, ejecuta el onClickListner de LineaLayout.
public class MyView extends LinearLayout {
private OnClickListener clickListener;
ImageView imageView;
TextView textView;
@Override
public void setOnClickListener(@Nullable OnClickListener l) {
super.setOnClickListener(l);
clickListener = l;
}
void afterViews() {
imageView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
clickListener.onClick(MyView.this);
return false;
}
});
textView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
clickListener.onClick(MyView.this);
return false;
}
});
}
También traté de anular OnTouchListener, pero las vistas de mi hijo no tuvieron el efecto dominó que necesitaba.
Ninguna de las soluciones anteriores se bifurcó para mí. LinkMovementMethod
me di cuenta de que un LinkMovementMethod
establecido en TextView
dentro de mi LinearLayout
. Esta clase intercepta eventos táctiles, haga clic en eventos y propiedades de TextView
, como hacer clic, enfocar vs ...
Haga que su padre sea LinearLayout android: clickable = "true"
Cree todo el Android de childview : clicable = "falso"
En Linearlayout - Eliminar android: inputType = "" de TextView