126

フラグメントのテーマを設定しようとしています。

マニフェストでテーマを設定しても機能しません:

android:theme="@android:style/Theme.Holo.Light"

以前のブログを見ると、ContextThemeWrapper を使用する必要があるように見えます。コード例を紹介してくれる人はいますか? 何も見つかりません。

4

12 に答える 12

208

マニフェストでのテーマの設定は、通常、アクティビティに使用されます。

フラグメントのテーマを設定する場合は、フラグメントの onGetLayoutInflater() に次のコードを追加します。

override fun onGetLayoutInflater(savedInstanceState: Bundle?): LayoutInflater {
    val inflater = super.onGetLayoutInflater(savedInstanceState)
    val contextThemeWrapper: Context = ContextThemeWrapper(requireContext(), R.style.yourCustomTheme)
    return inflater.cloneInContext(contextThemeWrapper)
}
于 2013-03-19T10:04:05.113 に答える
25

Fragment は、Activity からテーマを取得します。各フラグメントには、それが存在するアクティビティのテーマが割り当てられます。

テーマは Fragment.onCreateView メソッドで適用されます。ここで、コードはビューを作成します。ビューは、実際にはテーマが使用されるオブジェクトです。

Fragment.onCreateView では、ビューを膨張させる LayoutInflater パラメータを取得し、テーマに使用される Context を保持します。実際には、これは Activity です。したがって、膨張したビューはアクティビティのテーマを使用します。

テーマをオーバーライドするには、LayoutInflater.cloneInContextを呼び出すことができます。これは、テーマの変更に使用できることをドキュメントで言及しています。ここで ContextThemeWrapper を使用できます。次に、複製されたインフレータを使用してフラグメントのビューを作成します。

于 2013-03-28T08:35:34.880 に答える
9

android:minSdkVersion="11"マニフェストに設定されていることを確認してください。これが、 David の例がうまくいかなかった原因かもしれません。

また、タグではなくタグの属性を設定android:theme="@android:style/Theme.Holo.Light"します。<application><activity>

別の考えられる問題は、を使用するときにコンテキストを取得する方法ですContextThemeWrapper()。のようなものを使用する場合はgetActivity().getApplicationContext()、代わりに置き換えてgetActivity()ください。

通常、Theme.Holo は、MainActivity にリンクされた Fragments に適用する必要があります。

フラグメントに別のテーマを適用する場合は、ContextThemeWrapper を使用することに注意してください。フラグメントを追加する MainActivity からコードを提供すると役立つ場合があります。


いくつかの便利なリンク:

親テーマに準拠していないフラグメントのカスタム ListView

于 2013-03-24T22:57:57.903 に答える
2

Java クラスを作成し、テーマを変更するレイアウトを onCreate メソッドで使用します。次に、マニフェストで通常どおり言及します。

于 2015-06-19T09:46:37.173 に答える
0

インフレータを呼び出す前に、フラグメント コンテキストにテーマを設定することで動作するようになりました。

注: これは、MvvmCross と組み合わせた Xamarin.Android の例です。これが Java プログラマーにも有効かどうかは 100% わかりません。しかし、あなたは試すことができます:)

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    Context.SetTheme(Theme);

    base.OnCreateView(inflater, container, savedInstanceState);

    var view = this.BindingInflate(FragmentLayoutId, container, false);

    // Doing some other stuff

    return view;
}

SetTheme 拡張メソッド コード

public static void SetTheme(this Context context, AppThemeStyle themeStyle)
{
    var themeStyleResId = themeStyle == AppThemeStyle.Dark ? Resource.Style.AppTheme : Resource.Style.AppTheme_Light;

    context.SetTheme(themeStyleResId);
}

これが何人かの人々に役立つことを願っています、乾杯!

于 2019-06-14T10:32:37.487 に答える