【问题标题】:Accessing activity from custom button从自定义按钮访问活动
【发布时间】:2012-10-29 20:49:38
【问题描述】:

也许我在这里错过了什么,但在这里。假设我扩展了 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();
}

【问题讨论】:

  • 请为您的问题提供一些背景信息(不是双关语)。你想对对话框或活动实例做什么?
  • 例如 MyButton 也可以使用 execute() 方法实现 Command 接口,并且在某些外部类中我可以使用 Command command = (Command) v 的 onClick() 方法;如果我单击按钮,execute() 方法就会运行。我需要从 MyButton 内部访问对话框实例,例如关闭对话框。读完后我只是好奇/玩:alvinalexander.com/java/…

标签: android


【解决方案1】:

我有类似的情况,我用这个 sn-p 解决了我的问题:

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

希望这可以帮助某人。

【讨论】:

  • 即插即用谢谢你,很高兴你没有使用可能导致异常的 switch 语句
【解决方案2】:

我不完全理解您在做什么,但您应该能够通过getOwnerActivity() 从您的对话框中获得对活动的引用。

也许:

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

    Activity activity = getOwnerActivity();
    ...
}

【讨论】:

  • 不幸的是它不起作用。至于 (Dialog) 上下文转换,甚至 Eclipse 都会抱怨。对我来说,(Activity)上下文产生 java.lang.ClassCastException 很奇怪:android.view.ContextThemeWrapper 不能转换为 android.app.Activity。无论如何感谢您的回复。
  • 你是对的,Dialog 不能转换为 Context,因为 Dialog 不扩展 Context...但是 getOwnerActivity() 方法应该可以工作(只要您按照文档建议打开 Dialog .)
猜你喜欢
  • 2015-10-18
  • 2013-05-10
  • 1970-01-01
  • 2017-10-12
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多