ご覧のとおり、コンテキストはラップされています。
ドリルダウンすると、コンストラクターで次のことがわかります。
Dialog(Context context, int theme, boolean createContextThemeWrapper) {
if (createContextThemeWrapper) {
if (theme == 0) {
TypedValue outValue = new TypedValue();
context.getTheme().resolveAttribute(com.android.internal.R.attr.dialogTheme,
outValue, true);
theme = outValue.resourceId;
}
mContext = new ContextThemeWrapper(context, theme);
} else {
mContext = context;
}
mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
Window w = PolicyManager.makeNewWindow(mContext);
mWindow = w;
w.setCallback(this);
w.setOnWindowDismissedCallback(this);
w.setWindowManager(mWindowManager, null, null);
w.setGravity(Gravity.CENTER);
mListenersHandler = new ListenersHandler(this);
}
現在設定されているテーマがない場合、コンテキストをラップします。
あなたがやっているようにそれをキャストすることはできますが、それがどれほど信頼できるかはわかりません.instanceofチェックを配置することはできますが、全体を新鮮な角度から見る必要があるかもしれません.
通常、フラグメントからアクティビティを取得する最良の方法は、代わりに getActivity() を使用してキャストすることです。リスナー onAttach() アプローチをアタッチすることをお勧めします。
Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
listener = (Listener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(TAG
+ " must implement Listener");
}
}
@Override
public void onDetach() {
listener = null;
super.onDetach();
}