krisk
krisk

Reputation: 237

Accessing activity from custom button

Maybe I'm missing sth here but here it is. Let say I extended Button

    public class MyButton extends Button {
        ...
        public MyButton(Context context, AttributeSet attrs) {
            super(context, attrs);
            ...
        }
    }
  1. If MyButton is in e.g. MyActivity I can simply cast context to activity.
  2. Now if MyButton is part of MyDialog (extends Dialog), context.getClass() will point to ContextThemeWrapper and I can not get activity.

So how can I get instance of dialog or activity in the second case?

EDIT Ok more code to better illustrate what I wanted to do:

public class MyDialog extends Dialog {
    private MyButton myButton;

    public MyDialog(Context context) {
        super(context)  

        this.setContentView(R.layout.my_dialog);
        this.setTitle("My Dialog");

        myButton = (MyButton) findViewById(R.id.my_button);
    }
}

public class MyButton extends Button implements Command {
    private MyActivity myActivity;

    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);

        System.out.println(context instanceof ContextThemeWrapper); // TRUE
        System.out.println(context instanceof Activity); // FALSE

        myActivity = ??? // or myDialog = ???
    }

    @Override
    public void execute() {
        MyDialog myDialog = myActivity.getMyDialog();
        myDialog.cancel();
    }

}

and somewhere in other class after connecting listener:

@Override
public void onClick(View v) {
    Command command = (Command) v;
    command.execute();
}

Upvotes: 4

Views: 3631

Answers (2)

kikea
kikea

Reputation: 1569

I had similar situation and I solve my case wit this snippet:

private static Activity scanForActivity(Context cont) {
    if (cont == null)
        return null;
    else if (cont instanceof Activity)
        return (Activity)cont;
    else if (cont instanceof ContextWrapper)
        return scanForActivity(((ContextWrapper)cont).getBaseContext());

    return null;
}

Hope that this can help somebody.

Upvotes: 20

Sam
Sam

Reputation: 86958

I'm don't fully understand what you are doing, but you should be able to get a reference to the Activity from your Dialog with getOwnerActivity().

Perhaps:

public MyButton(Context context, AttributeSet attrs) {
    super(context, attrs);

    Activity activity = getOwnerActivity();
    ...
}

Upvotes: 1

Related Questions