首页 > 解决方案 > 实现一个将覆盖 onClick() 的类

问题描述

我想创建一个方法,当在其他类中实现时,你只需要传递一些参数,然后调用-onclick() 函数来设置元素。

目前,我刚刚做到了这一点。但这给了我一个 RunTimeException

无法启动活动 ComponentInfo{com.example.test/com.example.testActivity.MainActivity}:java.lang.NullPointerException:尝试调用虚拟方法 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()'在空对象引用上

我的代码:

类:可点击


imports ...

public class ClickeableOptions implements View.OnClickListener{
    private CardView cardView;
    private Context cont;
    private Class actTarget;

    public OpcionesMainClickeables() {}

    public ClickeableOptions(CardView cardView, Context cont, Class actTarget) {
        this.cardView = cardView;
        this.cont = cont;
        this.actTarget= actTarget;
    }
        //Getters and Setters

    @Override
    public void onClick(View v) {
        getCardView().setOnClickListener(this);
        Intent intent = new Intent(this.getCont(), this.getActTarget());
        startActivity(intent);
    }
}

我想像这样实现这个类......

public class MainActivity extends AppCompatActivity{

    private CardView cvRegistration;

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

        cvRegistration = (CardView) findViewById(R.id.cvRegistration);

        ClickeableOptions optionRegistration = new ClickeableOptions(
                cvRegistration, this, Registration.class
        );

        optionRegistration.onClick(optionRegistration.getCardView());
    }

我已经在同一个文件中实现了该方法,但我想这样做以使事情更整洁。我认为问题在于使用this,但我真的不明白

标签: javaandroidandroid-studioooponclick

解决方案


  1. 虽然您已经实例化了 ClickeableOptions(从 Activity 派生)对象,但它的任何 Activity 生命周期方法都没有被调用,也没有完成与超类实例化相关的工作(通常应该在 onCreate 中完成)。因此 ActivityThread 只是 null 并且您在调用时遇到了异常 startActivity(intent);

  2. 如果您想在CardView单击时开始另一个活动,那么您需要

    • 听从 Leo Leontev 的建议:打电话 getCont().startActivity(intent) 而不是 startActivity(intent)
    • 将该行移动 getCardView().setOnClickListener(this)ClickeableOptions自定义构造函数的最底线
    • MainActivity$onCreate()从您的方法 中删除此行:optionRegistration.onClick(optionRegistration.getCardView());

完成上述所有操作后,您将能够在点击事件上开始新的活动。


推荐阅读