2012-09-05 7 views
6

So habe ich benutzerdefinierte Listenelement mit Schaltflächen für eine ListView. Wenn diese Taste gedrückt wird, kann die Schaltfläche abwechselnd gezeichnet werden, um dem Benutzer eine Rückmeldung zu geben. Wenn ich jedoch auf die Zeile klicke, zeigen alle Schaltflächen den gedrückten Zustand an, als ob ich auf sie geklickt hätte.Wie zu verhindern, dass Button in ListItem Highlight bekommen

Wie behalte ich die Schaltfläche zeigt ihren ursprünglichen Zustand anstelle von state_pressed?

Layout/List Item:

<LinearLayout 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:layout_weight="1" 
    android:orientation="horizontal" 
    android:paddingBottom="10dp" 
    android:paddingTop="10dp" 
    android:descendantFocusability="blocksDescendants" > 

    <LinearLayout 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     android:orientation="vertical" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" 
     android:gravity="center_vertical|left" > 

     <TextView 
      android:id="@+id/txtMain" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:singleLine="true" 
      android:textAppearance="?android:attr/textAppearanceLarge" 
      style="@style/PrimaryText" /> 

     <TextView 
      android:id="@+id/txtSub" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:singleLine="true" 
      android:textAppearance="?android:attr/textAppearanceLarge" 
      style="@style/SecondaryText" /> 
    </LinearLayout> 

    <ImageButton 
     android:id="@+id/imbResponse" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@null" 
     android:focusable="false" 
     android:duplicateParentState="false" 
     android:src="@drawable/response_btn" 
     android:contentDescription="@string/response" 
     android:layout_marginLeft="10dp" 
     android:layout_marginTop="5dp" 
     android:layout_marginRight="10dp" 
     android:layout_marginBottom="5dp" /> 
</LinearLayout> 

ziehbar/response_btn.xml:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:state_focused="true" android:drawable="@drawable/res_m" /> 
    <item android:state_pressed="true" android:drawable="@drawable/res_m" /> 
    <item android:state_focused="false" android:state_pressed="false" android:drawable="@drawable/res_alt_m" /> 
</selector> 

Ich habe versucht, entfernen state_focused und state_pressed, state_focused. Es scheint, dass der Button state_pressed von seinem Elternteil nimmt.

+0

Haben Sie Glück, eine Lösung zu finden? – Sunkas

Antwort

0

im meiner Meinung nach müssen Sie den Zustand des übergeordneten als android:duplicateParentState="false"

fügen Sie diese zu Ihrer Button

+0

Was ich getan habe;). Es ist übrigens ImageButton. – RobGThai

+0

auch in Ihren Layouts –

+5

Ich habe es versucht, aber keinen Unterschied. – RobGThai

1

Das macht meine App härter arbeiten deaktivieren, aber es löst das Problem:

... 
mImageIcon.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       v.setBackgroundResource(R.drawable.my-background); 
       break; 
      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_CANCEL: 
       /* 
       * You can use another background rather than 0. 
       */ 
       v.setBackgroundResource(0); 
       break; 
      } 

      return false; 
     }// onTouch() 
    }); 
+0

Könntest du diese Lösung erklären? –

4

Ich habe herausgefunden, dass die Einstellung android:clickable="true" für die übergeordnete Ansicht verhindert, dass der Status der untergeordneten Ansichten geändert wird.

Siehe this answer.

1

Ich habe dieses Problem auch, ich google es und versuche es etwa 3 Stunden! Jetzt habe ich die Lösung gefunden. Fügen Sie OnClickListener nur zur untergeordneten Ansicht hinzu. und sogar nichts in OnClick-Methode. Es funktioniert auf 2.3 Emulator und meinem Nexus 5.