android java onClick 无法执行活动的方法 [英] android java onClick Could not execute method of the activity

查看:38
本文介绍了android java onClick 无法执行活动的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我第一次使用 recyclerview,我遇到了一些关于 android:onClick="addItem" 的错误,这是我尝试向我的 recyclerview 添加一行文本时得到的.我通常使用手机来测试我的应用.

This is my first time working with the recyclerview and I am getting some errors about android:onClick="addItem" here is what I get when I try to add a line of text to my recyclerview. I usually use my phone to test my apps.

java.lang.IllegalStateException: Could not execute method of the activity
            at android.view.View$1.onClick(View.java:4012)
            at android.view.View.performClick(View.java:4761)
            at android.view.View$PerformClick.run(View.java:19767)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5312)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at android.view.View$1.onClick(View.java:4007)
            at android.view.View.performClick(View.java:4761)
            at android.view.View$PerformClick.run(View.java:19767)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5312)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
            at com.sapps.app.testapp2.MainActivity.addItem(MainActivity.java:53)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at android.view.View$1.onClick(View.java:4007)
            at android.view.View.performClick(View.java:4761)
            at android.view.View$PerformClick.run(View.java:19767)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5312)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)

这是我认为是错误的代码,但我不知道确切:

Here is my code where I think is the error, but I don't know exactly:

 public class MainActivity extends ActionBarActivity {

private EditText mText;
private RecyclerView.LayoutManager mLayoutManager;
private RecyclerView recyclerView;
private Button btn;
private CustomRecyclerAdapter mAdapter;

private List<Data> mData = new ArrayList<>();

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

    // Initializing views.
    mText = (EditText) findViewById(R.id.textEt);
    recyclerView = (RecyclerView) findViewById(R.id.recycler);

    // If the size of views will not change as the data changes.
    recyclerView.setHasFixedSize(true);

    // Setting the LayoutManager.
    mLayoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(mLayoutManager);

    // Setting the adapter.
    CustomRecyclerAdapter mAdapter = new CustomRecyclerAdapter();
    recyclerView.setAdapter(mAdapter);
}



// Called when add button is clicked.
public void addItem(View v) {

    if(mText!=null) {
        Data dataToAdd = new Data(mText.getText().toString()); mData.add(dataToAdd);
    }
}

}

这是我要确定的 recyclerview 适配器:

And here is my recyclerview adapter to know for sure:

public class CustomRecyclerAdapter extends RecyclerView.Adapter<RecyclerViewHolder> {

    CustomRecyclerAdapter mAdapter;

    private List<Data> mData = Collections.emptyList();

    public CustomRecyclerAdapter() {
        // Pass context or other static stuff that will be needed.
    }

    public void updateList(List<Data> data) {
        mData = data;
        notifyDataSetChanged();
    }
    @Override
    public int getItemCount() {
        return mData.size();
    }

    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) {
        LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
        View itemView = inflater.inflate(R.layout.list_item, viewGroup, false);
        return new RecyclerViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(RecyclerViewHolder viewHolder, int position) {
        viewHolder.title.setText(mData.get(position).text);
    }

    public void addItemInRec(int position, Data data) {
        mData.add(data);
        notifyItemInserted(position);
    }

    public void removeItem(int position) {
        mData.remove(position);
        notifyItemRemoved(position);
    }
}

我的 MainActivity xml 文件:

My MainActivity xml file:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:id="@+id/textEt"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="Text"/>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add"
            android:onClick="addItem"/>

    </LinearLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"/>

</LinearLayout>

也许是我的 ViewHolder:

Maybe it is my ViewHolder:

public class RecyclerViewHolder extends RecyclerView.ViewHolder {

    public TextView title;

    public RecyclerViewHolder(View itemView) {
        super(itemView);
        title = (TextView) itemView.findViewById(R.id.title);
    }
}

或者Data.java类:

Or Data.java class:

public class Data {

        public String text;
        public Data(String text) {
            this.text = text;
        }
    }

推荐答案

关键在你的错误信息中:

The key is in your error message:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
            at com.sapps.app.testapp2.MainActivity.addItem(MainActivity.java:53)

从错误输出中学习的一个很好的技巧是查看每个Caused by"语句,并扫描日志,直到找到您自己引用的文件之一.然后,错误日志的那部分甚至会告诉您代码在哪一行失败(在本例中是 MainActivity.java 的第 53 行).

A good tip for learning from your error output is to look at each "Caused by" statement, and scan through the log until you find one of your own files referenced. Then that part of the error log will even tell you what line your code was failing on ( in this case it is line 53 on MainActivity.java).

Java 中的空指针异常是当您尝试对某个对象A"调用方法时,但该对象A"当前为 null.

A Null Pointer Exception in Java is when you attempt to call a method on some object 'A', but that object 'A' is currently null.

所以这个错误信息意味着:在 MainActivity.java 的第 53 行,你试图调用某个尚不存在的对象的方法,所以我崩溃了."

So this error message means: "On line 53 of MainActivity.java, you tried to call a method on some object which doesn't exist yet, so I crashed."

失败的方法是 EditText mText = (EditText) findViewById(R.id.textEt);

通常这种类型的失败意味着您没有从布局中找到正确的 ID.仔细检查 textEt 是否是此布局元素的正确 ID.

Usually this type of failure means that you aren't finding the right ID from your layout. Double check that textEt is the correct ID for this layout element.

仍然不确定为什么您的视图没有被填充,但我确实注意到您的适配器有错误.您正在重新定义 mAdapter,因此您有 2 个副本,一个在本地范围内,另一个作为 MainActivity 的成员.这肯定会把事情搞砸.

Still not sure why your views aren't getting populated, but I did notice an error with your adapter. You are redefining mAdapter, so you have 2 copies, one in local scope and one as a member to MainActivity. This will definitely mess things up.

就在这里:

// Setting the adapter.
CustomRecyclerAdapter mAdapter = new CustomRecyclerAdapter();
recyclerView.setAdapter(mAdapter)

您正在本地重新定义 mAdapter.改为这样做:

You are redefining mAdapter locally. Do this instead:

// Setting the adapter.
mAdapter = new CustomRecyclerAdapter();
recyclerView.setAdapter(mAdapter)

这篇关于android java onClick 无法执行活动的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆