2016-05-02 12 views
0

Für eine Listview mit benutzerdefinierten Reihe Layout wie folgt aus:Fokussierbare Knopf in Listview

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" android:layout_width="match_parent" 
android:layout_height="match_parent"> 


    <Button 
    android:layout_width="51dp" 
    android:layout_height="43dp" 
    android:id="@+id/btnBin" 
    android:focusable="false" 
    android:focusableInTouchMode="false" 
    android:background="@drawable/ktape" /> 

    <TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="Temporary" 
    android:id="@+id/txtShowUsername" 
    android:layout_gravity="center_horizontal" 
    android:layout_weight="1" 
    android:paddingTop="20dp" 
    android:gravity="right" 
     android:paddingRight="10dp" /> 
</LinearLayout> 

die Taste sollte nicht fokussierbar sein das Listview die OnItemClickListener ausführen zu lassen:

android:focusable="false" 
    android:focusableInTouchMode="false" 

Warum muss ich mich einstellen der Fokus auf falsch? Warum verhindert eine fokussierbare Schaltfläche die Ausführung von OnItemClickListener.OnItemClick()?

+0

Was passiert? Arbeitet der Artikel Klick-Listener? – Raghunandan

+0

@Raghunandan, ich möchte wissen, warum ich den Fokus auf false setzen muss. – Alireza

+0

Sie können den Quellcode ansehen und finden Sie den Warum Teil – Raghunandan

Antwort

0

Versuchen das Hinzufügen dieser Zeile:

android:clickable="false" 
+0

Dieser Code funktioniert, möchte ich wissen, warum ich den Fokus auf false setzen muss. – Alireza

+0

Ich bin mir nicht sicher, aber ich denke, wenn Sie nicht, wenn Sie auf die Schaltfläche klicken, wenn fokussierbar ist wahr und anklickbar ist false passiert nichts (nicht einmal onitemclick von listview) –

+0

Ja, das ist wahr. Aber ich möchte wissen warum? – Alireza

1

Wenn Sie etwas auf dem Bildschirm, die Touch-Geste berühren ist der Stammansicht des Layouts erhalten. Dann übergibt es die Berührungsgeste nacheinander an sein Kind, bis es verbraucht ist. Wenn das Kind eine anklickbare Ansicht ist, verwendet es die Berührungsgeste und gibt true zurück. Damit wird die Touch-Geste nicht an andere Views übergeben. Wenn das Kind keine anklickbare Ansicht ist, gibt es nur false zurück, die Berührungsgeste wird an die nächsten Kinder weitergegeben.

Schließlich, wenn keine Kind-Ansicht die Berührungsgeste verbraucht, wird sie an den Eltern selbst zurückgesendet. Jetzt kann das Elternteil die Berührungsgeste konsumieren, falls es welche hat.

Jetzt in Ihrem Fall ist ListView Eltern und Button ist das Kind. Zuerst übergibt ListView die Berührungsgeste an die Schaltfläche. Da die Schaltfläche standardmäßig eine anklickbare Ansicht ist, wird die Berührungsgeste verwendet, sodass der OnItemClickListener von ListView nicht funktioniert. Durch explizites Festlegen des fokussierbaren, fokussierbaren InTouchModus, der als false anklickbar ist, wird der Button nicht mehr anklickbar. Der Button wird also nicht die Touch-Geste konsumieren und der OnItemClickListener von ListView funktioniert.

+0

Danke für die Antwort. Sie wissen, indem Sie fokussierbar auf "falsch" setzen, kann ich clickListener für Button und itemClickListener für Listenelemente haben und es funktioniert gut. Kurz gesagt, der Button ist noch anklickbar. – Alireza

+0

Wenn Sie auf die Schaltfläche tippen, funktioniert die ClickListener-Schaltfläche im Idealfall und der OnItemClickListener von ListView wird nicht ausgelöst. Wenn Sie auf das ListView-Element (nicht auf den Button) tippen, funktioniert der ListView OnItemClickListener und der ClickListener von Button wird nicht ausgelöst. – Bob

+0

Ich denke, anstelle von Android: focusable = "false", sollten Sie das Attribut Android: demcendantFocusability = "blocksDescendants" zum Root-Layout des Elements ListView hinzufügen. http://developer.android.com/reference/android/view/ViewGroup.html#attr_android%3adescendantFocusability – Bob