从自定义按钮访问活动

时间:2012-10-29 20:49:39

标签: android

也许我在这里错过了,但在这里。假设我扩展了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,我无法获得活动。
  3. 那么如何在第二种情况下获得对话或活动的实例呢?

    修改 更多代码可以更好地说明我想要做的事情:

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

2 个答案:

答案 0 :(得分: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;
}

希望这可以帮助某人。

答案 1 :(得分:1)

我不完全明白你在做什么,但你应该能够通过getOwnerActivity()从对话框中获取对活动的引用。

也许:

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

    Activity activity = getOwnerActivity();
    ...
}