从自定义按钮访问活动

kri*_*isk 3 android

也许我在这里错过了,但在这里.让我说扩展Button

    public class MyButton extends Button {
        ...
        public MyButton(Context context, AttributeSet attrs) {
            super(context, attrs);
            ...
        }
    }
Run Code Online (Sandbox Code Playgroud)
  1. 如果MyButton在例如MyActivity中,我可以简单地将上下文转换为活动.
  2. 现在,如果MyButton是MyDialog(扩展Dialog)的一部分,context.getClass()将指向ContextThemeWrapper,我无法获得活动.

那么如何在第二种情况下获得对话或活动的实例?

编辑 更多代码以更好地说明我想要做的事情:

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

}
Run Code Online (Sandbox Code Playgroud)

连接监听器后在其他类中的某个位置:

@Override
public void onClick(View v) {
    Command command = (Command) v;
    command.execute();
}
Run Code Online (Sandbox Code Playgroud)

kik*_*kea 17

我有类似的情况,我用这个片段解决了我的情况:

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;
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助某人.