2014-10-02 13 views
5

Mam ListView wypełniony z niestandardowej karty. Każdy wiersz ma 1 przycisk. W xml przycisk ma przekazany atrybut onClick. Mam ustawiony tylko xml, a nie wszystkie OnClickListeners. Zwróć też uwagę, że publiczny void myMethod (View v) istnieje w mojej CustomActivity. Otrzymuję następujący wyjątekAndroid nie może znaleźć metody z przycisku onClick w wierszu listy Widok

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' 

metody w działalność:

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

Przycisk XML:

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

Interesującą uwaga w Wyjątkiem jest, że aplikacja próbuje znaleźć sposób na android.app.Application, a nie w mojej niestandardowej aktywności.

Wszelkie sugestie?

Odpowiedz

3

Ważne jest, aby MyActivity i z CustomAdapter muszą być tą samą instancją. Porównaj swoje z moim.

Moi kody:

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

Masz rację, chociaż już znalazłem odpowiedź. Przekazałem wynik "getApplicationContext()" w adapterze zamiast mojej niestandardowej aktywności ... Wielkie dzięki – Panos

1

Zakładam, że napisałeś niestandardową kartę dla tego widoku, więc w adapterze, gdy wywołujesz getView, po prostu findElementById na przycisku i ustaw tam na onClickListener.

+0

Prawdopodobnie nie można bezpiecznie założyć, że OP już napisał niestandardową kartę. Sugerowanie, że to robi, wydaje mi się jednak dobrym pomysłem. –

0

Jest to jeden z przykładów, dlaczego atrybut onClick jest uznawany za uszkodzony. Najlepiej jest utworzyć niestandardowy adapter, a w metodzie getView() ustawić ręcznie OnClickListener.

3

Podczas tworzenia niestandardowego Adapter przechodziłem jako Context wynik metody getApplicationContext(). To było złe. Powinienem przekazać this (mój niestandardowy Activity) jako Context. Teraz działa jak urok.