4

也许我在这里错过了某事,但在这里。假设我扩展了 Button

    public class MyButton extends Button {
        ...
        public MyButton(Context context, AttributeSet attrs) {
            super(context, attrs);
            ...
        }
    }
  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();
    }

}

连接监听器后在其他类的某个地方:

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

2 回答 2

20

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

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

希望这可以帮助某人。

于 2014-12-12T00:00:21.007 回答
1

我不完全理解你在做什么,但你应该能够从你的 Dialog 中获得对 Activity 的引用getOwnerActivity()

也许:

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

    Activity activity = getOwnerActivity();
    ...
}
于 2012-10-29T20:55:44.823 回答