10

この質問は、先週行われた AndroidDev Office Hours ハングアウトの Google モデレーターに最初に投稿されました。質問は実際にライブで回答されており、必要に応じてここで見ることができます. 彼らがそれに興味をそそられたように見えたので、ここに投稿しています。ここでは、もう少し詳しく説明する余地があります.

AWebViewは通常、作成者が意図したとおりに Web コンテンツを表示するために使用されます (ハングアウトで述べているように)。ただしWebView、コンテンツ自体ではなく、書式設定されたテキスト(主に太字、斜体、箇条書き、テキストの配置) を表示するために a を使用します。WebViewたくさんの TextView を使用してすべてを完全にフォーマットしておくよりも (つまり、HTML/CSS を使用すると) はるかに簡単です。

問題は、私がこれをWebView透明な背景で使用していることですAlertDialog. テキストのWebView色は読み込まれたコンテンツの CSS から取得されますが、この色が の背景色と対照的であることが重要ですAlertDialog。それが私の問題です。

Android 2.3 までは、AlertDialog背景は常に暗かった。アプリのテーマがデフォルトのダーク テーマかライト テーマかに関係なくAlertDialog、ダーク グレーのままでした。これはバニラのAndroidで。しかし、スキン付きの Android (Sense、TouchWiz、MotoBlur など) でも、AlertDialog常に暗い色でした (デフォルト/暗いテーマと明るいテーマの両方)。

これはすべてICSで変更されました(おそらくHoneycombで変更されましたが、確認していません)。デフォルト/ダーク テーマにはダークAlertDialogがあり、ライト テーマには実際にはライトがありAlertDialogます。

私はアプリでライト テーマのみを使用しているので、WebView別の CSS ファイルを使用してコンテンツを読み込むことで問題を簡単に解決できました。ICS 未満のバージョンではテキストの色が濃く、ICS 以上ではテキストの色が薄くなります。OEMスキンがなければ、これでほとんど問題は解決します。

ICS のスキン バージョンでは、AlertDialog. か否か。彼らはAlertDialog、アプリのテーマに関係なく、通常どおり暗いバージョンと明るいテーマを提供しますが、暗いバージョンのみを提供する可能性が高くなります。

アプリを強制的Holoに実行して問題を解決することもできますが、システム全体がユーザーのデバイスでどのように表示されるかを妨げたくありません。たとえば、彼らが Sense を持っていて、それを本当に気に入っている場合、アプリを使用するときにHoloテーマを表示したくありません。AlertDialog

最終的に、私の質問はこれです:

それで、どうすればこれに対処できますか?背景WebViewに対してテキストが読めるようにするにはどうすればよいですか? AlertDialogAndroid のバージョン、使用されているテーマ、または OEM によってスキンされているかどうかに関係なく...

これがどれほど実現可能かはわかりませんが、この問題を解決するための 1 つの代替手段AlertDialogは、デバイスのテーマからテキストの色を抽出することです。しかし、デフォルトのテーマやHoloテーマではなく、DeviceDefault私が信じているテーマです。

この抽出は簡単ですか?それは私の問題の良い解決策になるでしょうか?他の選択肢はありますか?

最後にもう 1 つ詳細があります... ハングアウトを見て、実際に私に答えてくれた人たちの 1 人が、CSS を挿入することを提案しました。もし私が前に明確でなかったなら、私はそれをする必要はありません。WebViewテーマから抽出されたテキストの色を取得できる、必要な正確な CSS を使用してコンテンツ文字列を作成するだけです。

4

1 に答える 1

3

解決策を見つけるには、実行時にダイアログで使用されるテーマを特定できなければならないと思います。テーマを明示的に設定していないと思います。これは、デフォルトのダイアログ テーマが使用されることを意味します。次のコードは Dialog クラスからのもので、テーマが明示的に設定されていない場合に、デフォルトのテーマが実際にどのようにダイアログに適用されるかを示しています。

Dialog(Context context, int theme, boolean createContextWrapper) {
    if (theme == 0) {
        TypedValue outValue = new TypedValue();
        context.getTheme().resolveAttribute(com.android.internal.R.attr.dialogTheme,
                outValue, true);
        theme = outValue.resourceId;
    }

    mContext = createContextWrapper ? new ContextThemeWrapper(context, theme) : context;
    mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
    Window w = PolicyManager.makeNewWindow(mContext);
    mWindow = w;
    w.setCallback(this);
    w.setWindowManager(mWindowManager, null, null);
    w.setGravity(Gravity.CENTER);
    mUiThread = Thread.currentThread();
    mListenersHandler = new ListenersHandler(this);
    }

次に、そのテーマの主要なテキストの色が何であるかを調べる必要があります。次のように実行できます (変数 dialog はダイアログへの参照です)。

    TypedValue tv = new TypedValue();
    dialog.getContext().getTheme().resolveAttribute(android.R.attr.textColorPrimary, tv, true);
    int textColor = getResources().getColor(tv.resourceId);

テキストの色を取得したので、その値を Web ビューに挿入するだけです。このコードを次のデバイスでテストしました

Honeycomm を実行する Samsung Galaxy Tab 10.1

  • Theme.Holo.Light はテキストの色を真っ黒にしました
  • Theme.Holo はテキストの色を真っ白にしました

ジンジャーブレッドを実行している HTC センセーション

  • Theme.Light は純粋な白のテキスト色を与えました (ダイアログの背景が暗いため、これは正しいです)
  • Theme.Black もテキストの色を真っ白にしました

ジンジャーブレッドを実行する Samsung Galaxy S2

  • Theme.Black の textcolor が明るい灰色になった (ffc8c8c8)
  • Theme.Light は同じテキストカラーを与えました (ffc8c8c8)

ICS エミュレータ

  • Theme.Holo.Light は純粋な黒のテキスト色を与えました
  • Theme.Holo は非常に薄い灰色を与えました (fff3f3f3)

したがって、この方法は、テストされたすべてのデバイスで正常に機能しました。

乾杯レナード

于 2012-03-25T21:20:42.300 に答える