2014-10-02 4 views
5

Ich habe ein ListView von einem benutzerdefinierten Adapter aufgefüllt. Jede Zeile enthält 1 Schaltfläche. In der XML-Datei wird das onClick-Attribut an die Schaltfläche übergeben. Ich habe nur die Xml, nicht irgendwelche OnClickListeners gesetzt. Beachten Sie auch, dass die öffentliche void myMethod (View v) in meiner CustomActivity vorhanden ist. Ich erhalte die folgende AusnahmeAndroid kann die Methode nicht über die Schaltfläche onClick in der ListView-Zeile finden

10-02 03:01:46.463: E/AndroidRuntime(26857): java.lang.IllegalStateException: Could not find a method myClickHandler(View) in the activity class **android.app.Application** for onClick handler on view class android.widget.Button with id 'myButton' 

Verfahren Aktivität:

public void myClickHandler(View v) { 
    ... do stuff here... 
} 

Button-XML:

 <Button 
      android:id="@+id/myButton" 
      android:layout_width="44dp" 
      android:layout_height="44dp" 
      android:background="@drawable/eye_icon" 
      android:onClick="myClickHandler" 
      /> 

Eine interessante Note in der Ausnahme ist, dass die App versucht, das Verfahren in zu finden android.app.Application und nicht in meiner benutzerdefinierten Aktivität.

Irgendwelche Vorschläge?

Antwort

3

Es ist wichtig, dass MyActivity und getContext() von CustomAdapter die gleiche Instanz sein müssen. Vergleiche deine mit meiner.

Meine Codes:

MyActivity.java

public class MyActivity extends Activity { 
    public static final String TAG = "MyActivity"; 
    private ListView mListView; 
    private CustomAdapter mAdapter; 
    private ArrayList<String> mData; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my); 

     mListView = (ListView) findViewById(R.id.listView); 

     mData = new ArrayList<String>(); 
     mData.add("111"); 
     mData.add("222"); 
     mData.add("333"); 
     mData.add("444"); 
     mData.add("555"); 

     mAdapter = new CustomAdapter(this, R.layout.list_item_view, mData); 
     mListView.setAdapter(mAdapter); 
    } 

    public void onClickHandler(View view) { 
     Log.i(TAG, "onClickHandler()"); 
    } 
} 

CustomAdapter.java

public class CustomAdapter extends ArrayAdapter<String> { 

    public CustomAdapter(Context context, int resource, ArrayList<String> objects) { 
     super(context, resource, objects); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.list_item_view, null); 
     } 

     return convertView; 
    } 
} 

activity_my.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context=".MyActivity"> 

    <ListView 
     android:id="@+id/listView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

</RelativeLayout> 

list_item_view.xml

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 
    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" 
     android:id="@+id/button" 
     android:onClick="onClickHandler"/> 
</LinearLayout> 
+0

Sie haben Recht, obwohl ich die Antwort bereits gefunden hatte. Ich habe das Ergebnis "getApplicationContext()" im Adapter anstelle meiner benutzerdefinierten Aktivität übergeben ... Vielen Dank – Panos

1

Ich nehme an, dass Sie einen benutzerdefinierten Adapter für diese Ansicht geschrieben haben, also in Ihrem Adapter, wenn Sie getView einfach findElementById auf der Schaltfläche aufrufen und den onClickListener dort festlegen.

+0

Es ist wahrscheinlich nicht sicher anzunehmen, dass das OP bereits einen benutzerdefinierten Adapter geschrieben hat. Es scheint mir jedoch eine gute Idee zu sein, dass er das tut. –

0

Dies ist ein Beispiel dafür, warum das onClick Attribut als fehlerhaft angesehen wird. Es ist wahrscheinlich am besten, einen benutzerdefinierten Adapter zu erstellen und in der getView()-Methode die OnClickListener manuell festzulegen.

3

Bei der Erstellung der benutzerdefinierten Adapter, wurde ich als Context das Ergebnis der getApplicationContext() Methode übergeben. Das war falsch. Ich sollte this (meine benutzerdefinierte Activity) als Context übergeben. Es funktioniert jetzt wie ein Zauber.

Verwandte Themen