0
public AsyncSyncWithCloud(HistoryFragmentActivity historyFragmentActivity) {
    this.historyFragmentActivity = historyFragmentActivity;
    progressDialog = new ProgressDialog(historyFragmentActivity);

    // ???
    // java.lang.ClassCastException: android.view.ContextThemeWrapper cannot be cast to xxx.charting.HistoryFragmentActivity
    HistoryFragmentActivity test = ((HistoryFragmentActivity)progressDialog.getContext());
}

なぜ自分自身Activityをコンテキストとして に渡すのか疑問に思っていましたProgressDialog。progressDialog から実行するとgetContext、以前に渡したものが得られませんか?

4

2 に答える 2

0

ご覧のとおり、コンテキストはラップされています。

ドリルダウンすると、コンストラクターで次のことがわかります。

    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();
}
于 2014-12-24T00:40:16.300 に答える
0

これが良い解決策かどうかわからない

    private HistoryFragmentActivity getHistoryFragmentActivity(ProgressDialog progressDialog) {
        return (HistoryFragmentActivity)(((android.content.ContextWrapper)progressDialog.getContext()).getBaseContext());
    }
于 2012-07-11T09:06:07.360 に答える