主题不适用于Fragment

时间:2015-04-29 18:54:03

标签: android android-fragments

我正在尝试在片段上应用特定主题。但由于某种原因,它没有发生。任何人都可以指出我的代码中的错误吗?还是更好的解决方案?

styles.xml中的主题:

<!-- Theme for trans actionbar -->
<style name="TransTheme" parent="@style/AppTheme">
    <item name="android:actionBarStyle">@style/TransActionbar</item>
    <item name="android:windowActionBarOverlay">true</item>
    <item name="actionBarStyle">@style/TransActionbar</item>
    <item name="windowActionBarOverlay">true</item>
</style>

@style/TransActionbar的位置:

<!-- Actionbar style for trans theme -->
<style name="TransActionbar" parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
    <item name="android:background">@color/first_trans_actionbar</item>
    <item name="background">@color/first_trans_actionbar</item>
</style>

我想如何在onCreateView()方法中的片段中应用主题:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    //set theme
    final Context contextWrapper = new ContextThemeWrapper(getActivity(), R.style.TransTheme);
    LayoutInflater localInflater = inflater.cloneInContext(contextWrapper);
    contentView = localInflater.inflate(R.layout.fragment_movie_detail,
            container, false);
    return contentView:
}

由于某种原因,Fragment保留了旧主题..

修改

所以基本上问题归结为:如何在一个活动的一个片段中使Actionbar透明(和叠加模式)?

5 个答案:

答案 0 :(得分:4)

感谢Tomask https://stackoverflow.com/a/34686405/5502121 您可以在运行时更改片段的Activity Theme中的属性。只需在使用自定义样式对片段进行充气之前覆盖它们并应用于当前主题:

  1. 说,您有一些要在片段中应用的属性,例如纹波颜色。使用此属性创建样式: 在 values / styles.xml

    <style name="colorControlHighlight_blue">
       <item name="colorControlHighlight">@color/main_blue_alpha26</item>
    </style>
    
  2. onCreateView()

    中的通货膨胀之前的片段中
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       getContext().getTheme().applyStyle(R.style.colorControlHighlight_blue, true); //blue ripple color
       View view = inflater.inflate(R.layout.my_fragment_layout, container, false);
       return view;
    }
    
  3. 此样式仅适用于此片段

答案 1 :(得分:3)

我想你想要在同一Fragment内切换两个(或更多)Activity,其中每个ActionBar可能要求Fragment覆盖或不覆盖,并且具有不同的背景,具体取决于当前的Activity

让我们放弃最重要的事情:到目前为止,您无法在运行时更改Activity的主题。

通过执行以下操作,您仍然可以相对轻松地完成您的工作:

  1. ActionBar主题设置为使用重叠的Fragment
  2. 对于那些您不希望覆盖ActionBar的{​​{1}},在其布局xml中,将顶部填充/边距设置为等于ActionBar高度。理想情况下,您只需参考the dimension resource for action bar height。对于那些你希望Fragment覆盖它们的ActionBar,你应该在它们的布局xml的顶部没有填充/边距。
  3. 当您切换Fragment时,请通过调用ActionBar更改getActionBar()的背景颜色(如果您使用支持库,则更改为getSupportActionBar),然后{{ 1}}或使用.setBackgroundColor(Color.TRANSPARENT)从资源中获得的任何颜色。你可以通过动画颜色变化来寻找比突然切换更奇特的东西,但这超出了这个问题的范围。
  4. ...

  5. 利润!

  6. 编辑:使用getResources().getColor(R.colors.some_color)

    如果您想使用Toolbar,那么执行此操作的方法是将其放在Toolbar布局中<include>的单独布局xml中,并为其提供一些ID你可以通过代码引用。确保Activity根布局是Z排序的内容,例如ActivityRelativeLayout,并将工具栏FrameLayout放在Y轴的顶部({{1} } <include>alignParentTop RelativeLayout},layout_gravity="top" FrameLayout放在您放置Toolbar的任何布局之后{1}}在里面,以便覆盖它们。

    <include> Fragment内执行此操作:

    Activity

    否则,原始答案中的所有内容仍然有效。

答案 2 :(得分:1)

查看支持库22.1的更改here,我已经看到您现在可以将主题应用于任何视图(这也意味着它可以应用于片段)。所以我相信如果你使用新的appcompat并将你想要的主题设置到你的片段的根视图中,那么它就可以了。

但是我可以看到你正试图改变ActionBar的风格......我认为这不会起作用,因为ActionBar是由你的Activity而不是你的片段创建的,所以它需要从你的活动。您需要更改活动中的主题才能执行此操作。

答案 3 :(得分:1)

这是您的解决方案,

如果您只想为特定的活动片段应用样式,则只需在调用片段的onCreateView()onAttach()之前添加此行,

getActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
getActivity().getWindow().setStatusBarColor(Color.TRANSPARENT);

并设置透明状态栏,然后将 false 设置为根布局的fitsSystemWindows属性,

android:fitsSystemWindows="false"

它对我有用,希望对其他人有帮助。

答案 4 :(得分:-1)

我认为你应该将主题应用于你的活动而不是片段。

尝试setTheme(R.style.TransTheme);在setContentView();

之上