2010-01-25 11 views
28

Ich habe ein kleines Problem mit einer Funktionalität, die ich gerne implementieren würde.onClickListener auf einem LinearLayout

Ich habe eine LinearLayout, die 2 TextViews enthält. Ich würde ein onClickListener darauf setzen, so dass es sich genau wie ein Element in einem ListView verhalten würde.

Ich habe versucht, einige mögliche Umsetzung von diesem, und habe es funktioniert mit dem XML-Attribut der LinearLayout.

Als ich die Anwendung möchte visuell auf einen Klick auf den LinearLayout reagieren (wie in einem ListView), ich habe dies in der Hörer Callback-Methode:

l.setBackgroundColor(android.R.drawable.list_selector_background); 

l ein LinearLayout Objekt ist, initialisiert mit findViewById() ;

Ich bekomme eine Anwendung nicht reagiert, wenn ich versuche, auf das Layout klicken. Ich habe versucht, den Code in der Callback-Methode durch eine Toast-Nachricht zu ersetzen, und es funktioniert, so denke ich, das Problem ist in der setBackgroundColor.

Ist jemand damit vertraut?

PS: Entschuldigung, ich kann jetzt nicht mehr Code posten, ich bin bei der Arbeit.

+5

Verwenden Sie DDMS oder 'adb logcat', um Ihre Stack-Ablaufverfolgung zu untersuchen, um die Quelle Ihrer Ausnahme zu finden. Bearbeite diese Frage und poste sie hier, wenn du sie nicht verstehen kannst. – CommonsWare

Antwort

62

Sie müssen LinearLayout Attribut android:clickable="true" in der XML-Layout-Datei oder setClickable(true) im Java-Aktivitätscode festlegen.

+1

Ich denke '' 'android: clickable =" true "' '' wäre die Syntax. – trante

3

Ich habe festgestellt, dass setClickable (true) immer noch dazu führt, dass Klicks an die untergeordneten Elemente des linearen Layouts gehen. Ich fand, dass, um das LinearLayout die Berührung statt seiner Kinder zu erfassen, ich die Methode dispatchTouchEvent überschreiben musste, so dass ich eine Unterklasse von LinearLayout für genau diesen Zweck erstellte. Scheint aber wie eine hässliche Lösung.

+2

Ich denke, das ist, wo android: demcendantFocusability = "blocksDescendants" wäre sauberer, benutzerdefinierte Ansicht. https://developer.android.com/reference/android/view/ViewGroup.html # attr_android: descendantFocusability – scottyab

2

sollten Sie den Fokus des LinearLayouts auf "true" setzen und alle fokussierbaren Werte der untergeordneten Ansicht auf "false" setzen. Verwenden Sie nicht den android: clickable = "true", aber Sie können die Auswirkung des Klickens des Linienlayouts nicht sehen. BTW, der beste Weg ist, das onTouchEvent api zu implementieren.

5

Ich habe festgestellt, dass alle obigen Hinweise nicht so hilfreich sind, solange eines der untergeordneten Elemente im LinearLayout das Attribut android hat: textIsSelectable = "true".

0

Hatte das gleiche Problem, ich habe seit einer Stunde alle Antworten in SO versucht, aber keiner hat funktioniert.

Dann erkannte ich, musste ich einfach meine Linearlayout auf dem Boden des Layout fördern, da andere Ansichten es blockiert, und es funktionierte dann, ohne an das Layout irgendwelche speziellen Attribute hinzufügen.

Setzen Sie es hier für den Fall, dass es jemandem irgendwann helfen könnte.

+0

Wie hast du es auf den Boden gelegt? –

+0

was meinst du mit unten, meinst du Z-Schicht oder Richtung? – HopefullyHelpful

Verwandte Themen