4

多分私はここに sth がありませんが、ここにあります。ボタンを拡張したとしましょう

    public class MyButton extends Button {
        ...
        public MyButton(Context context, AttributeSet attrs) {
            super(context, attrs);
            ...
        }
    }
  1. MyButton が MyActivity などにある場合、コンテキストをアクティビティに単純にキャストできます。
  2. MyButton が MyDialog (Dialog を拡張) の一部である場合、context.getClass() は ContextThemeWrapper を指し、アクティビティを取得できません。

では、2 番目のケースでダイアログまたはアクティビティのインスタンスを取得するにはどうすればよいでしょうか?

私がやりたかったことをよりよく説明するために、さらにコードを編集してください:

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

私はあなたが何をしているのか完全には理解していませんが、 でダイアログからアクティビティへの参照を取得できるはずですgetOwnerActivity()

多分:

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

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