来自expandableListView内的按钮的OnClickListeners的NullPointerException

时间:2017-12-17 19:43:58

标签: java android

问题在于:我有一个包含 expandableListView 的活动,我希望在每个组内部显示项目加上按钮,它必须启动另一个允许创建另一个项目并将其添加到列表中的活动。

我已经设法创建了按钮,(为此,当我们到达最后一个孩子(空子)时,一个空子被放在最后一个位置的每个组内部和getChildView中的按钮视图被建造)。 这是代码:

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

    if(isLastChild){
        LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.list_btn, null);
        Intent i = new Intent(_context,Menu.class);
        i.putExtra("WorkoutPosition", groupPosition);
        return convertView;
    }

    ...
}

这是按钮的XML代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical|center_horizontal">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="+ New Exercise"
        android:id="@+id/newExBtn"
        android:layout_gravity="center_vertical|center_horizontal"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"/>

</RelativeLayout>

工作正常但是当我尝试也设置OnClickListener时会抛出NullPointerException。

以下是代码:

Button newExBtn = (Button) findViewById(R.id.newExBtn);
    newExBtn.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v){
        ...

以下是我得到的例外情况:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference

似乎我正在尝试在不存在的按钮上设置监听器,但我无法理解为什么以及由谁来解决这个问题。 谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我猜您正在调用findViewById()中的Activity,甚至可能在将新的充气布局附加到它之前。当findViewById()以递归方式从Activity(您使用setContentView()时使用的布局)的根进行迭代时,在您将其附加到Activity之前,它将找不到此按钮(即为什么你得到null

你的代码应该是:

Button newExBtn = (Button) convertView.findViewById(R.id.newExBtn);
newExBtn.setOnClickListener(new View.OnClickListener(){
    ...