it-swarm.com.de

onClick wurde bei LinearLayout mit Kind nicht ausgelöst

Ich habe ein benutzerdefiniertes LinearLayout mit einem kleineren TextView-Kind. Ich möchte in der Lage sein, auf den Bereich zu klicken, der nicht von der TextView abgedeckt wird, also setze ich clickable = true und einen Onclicklistener für LinearLayout, aber onClick wird nicht ausgelöst. Wenn ich den Onclick-Listener in der TextView-Instanz setze, funktioniert er wie erwartet ...

Jeder kann helfen?

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>

Mein benutzerdefiniertes LinearLayout

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();
            }
        });
    }
}
48
jul

für jedes Kind

Android: duplicateParentState = "true"

54
Blackbelt

Android:duplicateParentState="true" hat mir nicht geholfen.

Damit Ihr Layout mit seinen untergeordneten Elementen anklickbar ist, müssen Sie diese Option für jedeschild-Elementhinzufügen: 

 Android:clickable="false"

Dann wird die Handhabung von Klicksupzuparentgehen.

80
Yurets

Dies ist nicht Ihr Fall, aber ich hatte ein ähnliches Problem mit anklickbarem ViewGroup. Nach einer Stunde der Suche nach einer Lösung fand ich heraus, dass ich Android:inputType auf TextView in meinem ViewGroup gesetzt habe, der onClick() Listener blockierte (keine Ahnung warum)

Verwenden Sie nicht Android:inputType mit TextView

20
elementstyle

Sie verwenden keine benutzerdefinierte Ansicht. Sie verwenden ein StandardlinearLayout. Ihr XML-Tag sollte Folgendes sein:

<com.yourcode.ARView ...> ... </com.yourcode.ARView>
2
cdhabecker

Machen Sie Ihre Eltern LinearLayout Android: clickable = "true"

Machen Sie alle/die Kinderansicht Android: clickable = "false"

Unter Linearlayout - Remove Android: inputType = "" aus TextView

1

Stellen Sie sicher, dass sich keine andere Ansicht über der Ansicht befindet, auf die Sie klicken möchten. Dies ist besonders häufig bei FrameLayouts (wo Ihr untergeordnetes LinearLayout möglicherweise abgedeckt ist) oder bei relativen Layouts haben Sie vergessen, diese Zeile zu aktualisieren:

Android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered"

damit Ansichten nicht denselben Raum ausfüllen.

1
ColossalChris

Der Android:duplicateParentState="true" hat mein TextView erstellt, als wäre er deaktiviert und kann kein Click-Ereignis empfangen.

Alles was Sie brauchen ist das TextView clickable="false". Das Klickereignis wird also an das übergeordnete Layout gesendet, und das TextView kann immer noch auf das Berührungsereignis reagieren (mit Ripple-Effekt).

1
nhoxbypass

Ihre TextView-Höhe deckt das gesamte übergeordnete Element (gesamtes Layout) ab, sodass Sie möglicherweise auf eine leere Stelle klicken, jedoch nicht auf das Layout. Versuchen Sie es mit wrap_content für Android: layout_height für Ihre TextView. Legen Sie auch den Click-Listener für das Layout fest.

1

Fügen Sie dem Linearlayout die folgenden Attribute hinzu .__ Alle Klickereignisse, die nicht von den untergeordneten Ansichten behandelt werden, werden automatisch an das LinearLayout übergeben.

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    ...
    Android:focusable="true"
    Android:clickable="true">

<child/>
<child/>

</LinearLayout>
0
Sanket Berde

Ich hatte das gleiche Problem und alle XML-Attribute funktionierten nicht. Ich denke, das passiert, weil ich die Ansichten programmgesteuert aufblase und hinzufüge. Der Fix für mich bestand darin, die aufgeblähte Root-Ansicht - auch programmgesteuert - nicht anklickbar zu machen:

View view = layoutInflater.inflate(R.layout.some_layout, someLinearLayout, false);
view.setClickable(false);

(Ja, ich habe versucht, den some_layout in XML nicht anklickbar zu machen.)

0
Roy Solberg

Erstellen Sie eine Variable für LinearLayout

LinearLayout layout;
layout.setOnClicknersetOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {                   
                Toast t = Toast.makeText(context, "hey!", Toast.LENGTH_SHORT);
                t.show();
            }
        });
0
AZIM MOHAMAD

Das Problem kann von der Textansicht stammen, die Android:layout_height="fill_parent" in ihrem Layout hat. Wenn das Problem dadurch nicht behoben wird, kann das Ereignis onClick () das Problem sein. Das lineare Layout ruft onClick () möglicherweise nicht immer auf, da es ein Layout ist. Versuchen Sie stattdessen, den onTouch () - Ereignislistener zu überschreiben.

0
A. Abiri

Keine der oben genannten Lösungen gab für mich ab. Dann fiel mir auf, dass eine LinkMovementMethod auf TextView in meiner LinearLayout gesetzt ist. Diese Klasse fängt Berührungsereignisse, Klickereignisse und Eigenschaften von TextView ab, z. 

0
savepopulation

Wenn es sich bei den fraglichen Ansichten um TextViews handelt, müssen Sie sie möglicherweise als focusable="false" festlegen, damit der erste Klick nicht für die Textansicht verwendet wird.

0
CorayThan

Ich hatte das gleiche Problem und alle XML-Attribute funktionierten nicht. Ich bin mir nicht sicher, ob dies passiert, weil ich programmgesteuert die Ansichten aufblase und hinzufüge, aber so habe ich das Problem gelöst.

Ich habe eine Klasse, die LinearLayout mit einem TextView und einem ImageView erweitert. Nach dem Aufblasen des Layouts und dem Abrufen der Ansichten habe ich den untergeordneten Ansichten einen OnClickListener zugewiesen. Wenn sie gedrückt wird, wird der onClickListner von LineaLayout ausgeführt.

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;
        }
    });
}

Ich habe auch versucht, OnTouchListener zu überschreiben, aber dann hatten meine Kind-Ansichten nicht den Ripple-Effekt, den ich brauchte.

0
Gilles Braun