フラグメントのテーマを設定しようとしています。
マニフェストでテーマを設定しても機能しません:
android:theme="@android:style/Theme.Holo.Light"
以前のブログを見ると、ContextThemeWrapper を使用する必要があるように見えます。コード例を紹介してくれる人はいますか? 何も見つかりません。
フラグメントのテーマを設定しようとしています。
マニフェストでテーマを設定しても機能しません:
android:theme="@android:style/Theme.Holo.Light"
以前のブログを見ると、ContextThemeWrapper を使用する必要があるように見えます。コード例を紹介してくれる人はいますか? 何も見つかりません。
マニフェストでのテーマの設定は、通常、アクティビティに使用されます。
フラグメントのテーマを設定する場合は、フラグメントの onGetLayoutInflater() に次のコードを追加します。
override fun onGetLayoutInflater(savedInstanceState: Bundle?): LayoutInflater {
val inflater = super.onGetLayoutInflater(savedInstanceState)
val contextThemeWrapper: Context = ContextThemeWrapper(requireContext(), R.style.yourCustomTheme)
return inflater.cloneInContext(contextThemeWrapper)
}
Fragment は、Activity からテーマを取得します。各フラグメントには、それが存在するアクティビティのテーマが割り当てられます。
テーマは Fragment.onCreateView メソッドで適用されます。ここで、コードはビューを作成します。ビューは、実際にはテーマが使用されるオブジェクトです。
Fragment.onCreateView では、ビューを膨張させる LayoutInflater パラメータを取得し、テーマに使用される Context を保持します。実際には、これは Activity です。したがって、膨張したビューはアクティビティのテーマを使用します。
テーマをオーバーライドするには、LayoutInflater.cloneInContextを呼び出すことができます。これは、テーマの変更に使用できることをドキュメントで言及しています。ここで ContextThemeWrapper を使用できます。次に、複製されたインフレータを使用してフラグメントのビューを作成します。
android:minSdkVersion="11"
マニフェストに設定されていることを確認してください。これが、 David の例がうまくいかなかった原因かもしれません。
また、タグではなくタグの属性を設定android:theme="@android:style/Theme.Holo.Light"
します。<application>
<activity>
別の考えられる問題は、を使用するときにコンテキストを取得する方法ですContextThemeWrapper()
。のようなものを使用する場合はgetActivity().getApplicationContext()
、代わりに置き換えてgetActivity()
ください。
通常、Theme.Holo は、MainActivity にリンクされた Fragments に適用する必要があります。
フラグメントに別のテーマを適用する場合は、ContextThemeWrapper を使用することに注意してください。フラグメントを追加する MainActivity からコードを提供すると役立つ場合があります。
いくつかの便利なリンク:
Java クラスを作成し、テーマを変更するレイアウトを onCreate メソッドで使用します。次に、マニフェストで通常どおり言及します。
インフレータを呼び出す前に、フラグメント コンテキストにテーマを設定することで動作するようになりました。
注: これは、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);
}
これが何人かの人々に役立つことを願っています、乾杯!