设置片段的主题
我试图设置一个片段的主题。
在清单中设置主题不起作用:
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>