Tim*_*nen 9 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>
Run Code Online (Sandbox Code Playgroud)
在哪里@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>
Run Code Online (Sandbox Code Playgroud)
我想如何在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:
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,Fragment保留了旧主题..
编辑
所以基本上问题归结为:如何在一个活动的一个片段中使Actionbar透明(和叠加模式)?
我猜你想被交换两个(或更多)FragmentS中一样Activity,每个人可以要求ActionBar要么被覆盖或没有,都根据当前不同的背景Fragment。
让我们解决最重要的事情:到目前为止,您无法Activity在运行时更改的主题。
通过执行以下操作,您仍然可以相对轻松地完成您的任务:
Activity主题设置为使用覆盖的ActionBar.Fragment不想ActionBar被覆盖的s ,在他们的布局 xml 中,设置一个等于ActionBar高度的顶部填充/边距。理想情况下,您只需引用操作栏高度的维度资源。对于那些Fragment你想要ActionBar覆盖它们的s ,你应该在他们的布局 xml 的顶部没有填充/边距。Fragments 时,ActionBar通过调用getActionBar()(或者getSupportActionBar如果您正在使用支持库)更改 的背景颜色,然后.setBackgroundColor(Color.TRANSPARENT)使用getResources().getColor(R.colors.some_color). 通过动画颜色变化,您可以选择比突然切换更花哨的东西,但这超出了本问题的范围。...
利润!
编辑:与 Toolbar
如果你想使用 a Toolbar,这样做的方法是将它放在一个单独的布局 xml 中,你<include>在你的Activity布局中,并给它一些可以通过代码引用的 ID。确保Activity根布局是具有 Z 排序的东西,例如RelativeLayout或FrameLayout,并将工具栏<include>放置在 Y 轴的顶部(alignParentTopforRelativeLayout或layout_gravity="top"for FrameLayout),并Toolbar <include>在您将Fragments放入的任何布局之后放置,以便它会覆盖他们。
在里面Activity onCreate做这个:
Toolbar yourToolbar = (Toolbar) findViewById(R.id.your_toolbar);
yourToolbar.setBackgroundColor(<whatever color you want>);
setSupportActionBar(yourToolbar);
ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true/false);
actionBar.setDisplayHomeAsUpEnabled(true/false);
actionBar.setTitle(<whatever title you want>);
Run Code Online (Sandbox Code Playgroud)
否则,我原始答案中的所有内容仍然有效。
thanks to Tomask /sf/answers/2428048381/ You can change attributes in Activity Theme of a fragment in runtime. Just overwrite them before fragment was inflated with your custom style and apply to a current Theme:
Say, you have some attributes that you want to apply in your fragment, for example ripple color. Make a style with this attribute: in values/styles.xml
<style name="colorControlHighlight_blue">
<item name="colorControlHighlight">@color/main_blue_alpha26</item>
</style>
Run Code Online (Sandbox Code Playgroud)In your fragment before inflation in 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;
}
Run Code Online (Sandbox Code Playgroud)This style will work only for this fragment
| 归档时间: |
|
| 查看次数: |
8164 次 |
| 最近记录: |