设置片段的主题

我试图设置一个片段的主题。

在清单中设置主题不起作用:

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

从以前的博客看,似乎我不得不使用ContextThemeWrapper。 任何人都可以参考我的代码示例? 我什么都找不到

清单中的设置主题通常用于“活动”。

如果你想设置主题为片段,添加下面的代码片段的onCreateView():

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // create ContextThemeWrapper from the original Activity Context with the custom theme final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.yourCustomTheme); // clone the inflater using the ContextThemeWrapper LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); // inflate the layout using the cloned inflater, not default inflater return localInflater.inflate(R.layout.yourLayout, container, false); } 

我也试图让我的片段对话框显示与其活动不同的主题,并遵循此解决scheme 。 就像评论中提到的一些人一样,我没有得到它的工作,对话不断显示在清单中指定的主题。 结果问题是我在onCreateDialog方法中使用AlertDialog.Builder构build对话框,所以没有使用我链接的答案中显示的onCreateView方法。 当我实例化AlertDialog.Builder我使用getActivity()传递上下文,而应该使用实例化的ConstextThemeWrapper

这是我的onCreateDialog的代码:

 @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Create ContextThemeWrapper from the original Activity Context ContextThemeWrapper contextThemeWrapper = new ContextThemeWrapper(getActivity(), android.R.style.Theme_DeviceDefault_Light_Dialog); LayoutInflater inflater = getActivity().getLayoutInflater().cloneInContext(contextThemeWrapper); // Now take note of the parameter passed into AlertDialog.Builder constructor AlertDialog.Builder builder = new AlertDialog.Builder(contextThemeWrapper); View view = inflater.inflate(R.layout.set_server_dialog, null); mEditText = (EditText) view.findViewById(R.id.txt_server); mEditText.requestFocus(); // Show soft keyboard automatically mEditText.setOnEditorActionListener(this); builder.setView(view); builder.setTitle(R.string.server_dialog); builder.setPositiveButton(android.R.string.ok, this); Dialog dialog = builder.create(); dialog.setCanceledOnTouchOutside(false); return dialog; } 

我原来的AlertDialog.Builder被实例化如下:

 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

我改为:

 AlertDialog.Builder builder = new AlertDialog.Builder(contextThemeWrapper); 

在这个改变后,片段对话框显示正确的主题。 所以,如果其他人有类似的问题,正在使用AlertDialog.Builder然后检查传递给构build器的上下文。 希望这可以帮助! 🙂

确保在清单中设置了android:minSdkVersion="11" 。 这可能是大卫的榜样不适合你的原因。

另外,为<application>标签设置android:theme="@android:style/Theme.Holo.Light"属性,而不是 <activity>标签。

当使用ContextThemeWrapper()时,另一个可能的问题可能是你获得Context的方式。 如果你使用类似getActivity().getApplicationContext()只是用getActivity()来代替它。

通常情况下,Theme.Holo应该应用于与MainActivity链接的碎片。

请注意,当你想为你的Fragment应用不同的主题时,你使用ContextThemeWrapper。 如果您从MainActivity中提供您添加碎片的代码,可能会有所帮助。

一些有用的链接:

如何在一个片段中应用主题

片段中的自定义ListView不遵守父主题

片段从其活动中获取主题。 每个片段都被分配了它存在的Activity的主题。

该主题应用于Fragment.onCreateView方法,您的代码创build视图,其实际上是使用主题的对象。

在Fragment.onCreateView中,你得到了LayoutInflater参数,这个参数膨胀了视图,它拥有用于主题的Context,实际上这就是Activity。 所以你的膨胀的意见使用活动的主题。

要覆盖主题,您可以调用LayoutInflater.cloneInContext ,它在Docs中提到它可能用于更改主题。 你可以在这里使用ContextThemeWrapper。 然后使用克隆的inflater创build片段的视图。

为了应用我刚刚使用的单一风格

 getContext().getTheme().applyStyle(styleId, true); 

在对片段的根视图进行膨胀之前 ,在片段的onCreateView()中,它适用于我。

我尝试了David提出的解决scheme,但并非在所有情况下都能正常工作:
1.对于添加到堆栈的第一个片段具有活动的主题,而不是在onCrateView中定义的主题,但是添加到堆栈的第二个片段正确地将它们应用到片段上。

2.在第二个片段,他们正确显示,我做了以下我强迫应用程序被closures的清理内存,重新打开应用程序,当活动与片段重新创build片段改变他们错了他们的Activity和片段的onCrateView中设置的不一样。

为了解决这个问题,我做了一个小小的改动,并用inflater.inflatereplace了容器参数。

我不知道inflater在某些情况下使用容器视图的上下文。

注意 – 即时通讯使用android.support.v4.app.Fragment&android.support.v7.app.AppCompatActivity。

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // create ContextThemeWrapper from the original Activity Context with the custom theme final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.yourCustomTheme); // clone the inflater using the ContextThemeWrapper LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); // inflate the layout using the cloned inflater, not default inflater return localInflater.inflate(R.layout.yourLayout, null, false); } 

创build一个java类,然后使用你想要在onCreate方法中改变主题的布局。然后在manifest中把它作为正常

你可以在onAttach尝试这个棒棒糖

final Window window = activity.getWindow(); window.setStatusBarColor(myStatusBarColor)

并在ondettach中将其设置回默认值

我在片段的布局文件中使用android:theme = "@style/myTheme"解决了这个问题。 例如,这会改变LinearLayout的风格及其内容,但不会改变LinearLayout 。 所以,为了用任何风格来装饰整个片段,将主题应用到最外层的父布局。

  <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:theme = "@style/myTheme" > <TextView android:id="@+id/tc_buttom_text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Time elapsed"></TextView> <TextView android:id="@+id/tc_buttom_text2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="00:00:00 00"></TextView> </LinearLayout>