Ron
Ron

Reputation: 53

Implementing a class that will override the onClick()

I want to create a method that, when implemented in other classes, you just need to pass some parameters and then call the - onclick() function to set the element.

At the moment, I´ve just done this. But this gives me a RunTimeException

Unable to start activity ComponentInfo{com.example.test/com.example.testActivity.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference

my code:

Class: clickeable


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);
    }
}

And i want to implement this class like this...

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());
    }

I've implemented the method in the same file, but I want to do it this way to keep things more tidy. I think the problem is in the use of this, but i really don't get it

Upvotes: 0

Views: 330

Answers (3)

stone
stone

Reputation: 294

  1. Although you have instantiated the ClickeableOptions (derived from Activity) object, none of its Activity life cycle methods have been called and none of the super class instantiation related work (normally should be done in onCreate) has been accomplished. Hence the ActivityThread is simply null and you've got an exception when invoking startActivity(intent);

  2. If you want to start another Activity on your CardView click then you need to

    • follow Leo Leontev's advice: call getCont().startActivity(intent) instead of startActivity(intent)
    • move the line getCardView().setOnClickListener(this) to the ClickeableOptions custom constructor's most bottom line
    • delete this line from your MainActivity$onCreate() method: optionRegistration.onClick(optionRegistration.getCardView());

After all of above is done you'll be able to start new activity on click event.

Upvotes: 1

Md. Asaduzzaman
Md. Asaduzzaman

Reputation: 15433

No need to call onClick explicitly from your Activity. Just try like below:

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

    this.cardView.setOnClickListener(this);
}

And inside onClick

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

And remove this line from Activity.

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

Now when you clicked your CardView, Then Activity transitions start.

Upvotes: 1

Lev Leontev
Lev Leontev

Reputation: 2615

Try to replace this line:

startActivity(intent);

with

getCont().startActivity(intent);

Also, why are you inheriting ClickeableOptions from AppCompatActivity?

Upvotes: 1

Related Questions