多分私はここに sth がありませんが、ここにあります。ボタンを拡張したとしましょう
public class MyButton extends Button {
...
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
...
}
}
- MyButton が MyActivity などにある場合、コンテキストをアクティビティに単純にキャストできます。
- 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();
}