【问题标题】:Implementing a class that will override the onClick()实现一个将覆盖 onClick() 的类
【发布时间】:2020-03-12 15:24:34
【问题描述】:

我想创建一个方法,当在其他类中实现时,你只需要传递一些参数,然后调用-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的使用,但我真的不明白

【问题讨论】:

    标签: java android android-studio oop onclick


    【解决方案1】:

    无需从您的活动中显式调用onClick。试试如下:

    public ClickeableOptions(CardView cardView, Context cont, Class actTarget) {
        this.cardView = cardView;
        this.cont = cont;
        this.actTarget= actTarget;
    
        this.cardView.setOnClickListener(this);
    }
    

    onClick里面

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

    并从 Activity 中删除这一行。

    //optionRegistration.onClick(optionRegistration.getCardView());
    

    现在,当您单击 CardView 时,Activity 转换开始。

    【讨论】:

    • 这是我不想做的,我已经这样做了,工作正常,但我想单独保留它,所以,如果我需要使另一个元素可点击,只需需要创建另一个 ClickeableOptions 对象并将 args 传递给它也许是多余的,但对我来说更有条理
    • 那你想要什么,请澄清
    • 对不起,第一次阅读没有得到您的评论。我现在就试试这个,实际上它对我来说是非常新的方法。
    • 就是这样!!非常感谢:D
    • 如果它有效,那么为什么不接受答案呢?您接受的答案与我的实现相同,我为您提供编码示例以更好地理解。希望你能理解。谢谢
    【解决方案2】:

    尝试替换这一行:

    startActivity(intent);
    

    getCont().startActivity(intent);
    

    另外,为什么要从 AppCompatActivity 继承 ClickeableOptions?

    【讨论】:

    • 工作得很好,现在没有错误,但它直接打开目标活动,而不是在点击卡片视图时。遗传可能来自以前的测试。我会删除它
    【解决方案3】:
    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());

    完成以上所有操作后,您就可以在点击事件上开始新的活动了。

    【讨论】:

      猜你喜欢
      • 2019-01-14
      • 1970-01-01
      • 2015-08-13
      • 2011-09-04
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多