2014-10-02 48 views
5

我有一个ListView从自定义适配器填充。每行有1个按钮。在xml中,按钮具有传递的onClick属性。我只有xml,没有设置任何OnClickListeners。另请注意,我的CustomActivity中存在public void myMethod(View v)。我得到以下异常的活动Android无法从列表视图的按钮的onClick中找到方法行

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' 

方法:

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

按钮XML:

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

在例外的一个有趣的注意的是,应用程序试图找到在方法android.app.Application而不是在我的自定义活动。

有什么建议吗?

回答

3

重要的是MyActivitygetContext()CustomAdapter必须是相同的实例。比较你与我的。

我的代码:

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

你说得对,虽然我已经找到了答案。我在适配器中传递了“getApplicationContext()”结果,而不是我的自定义活动......非常感谢 – Panos 2014-10-02 07:58:28

1

我假设你为此视图编写了一个自定义适配器,因此在调用getView时,只需在按钮上查找findElementById并在其中设置onClickListener即可。

+0

假设OP已经写了一个自定义适配器,可能并不安全。但是,建议他这样做对我来说似乎是个好主意。 – 2014-10-02 03:41:46

0

这是为什么onClick属性被认为中断的一个示例。最好创建一个自定义适配器,并在getView()方法中手动设置OnClickListener

3

当创建自定义Adapter时,我通过了ContextgetApplicationContext()方法的结果。这是错误的。我应该通过this(我的自定义Activity)作为Context。它现在像一种魅力。

相关问题