我有一个ActivityGroup嵌入了一些其他活动。但是在每个嵌入式活动布局的顶部都有一个分隔符(带阴影,就像窗口自定义标题下面一样)。
我不知道如何删除它。
Intent intent = new Intent(this, HomeLocalProductsActivity.class);
Window w = getLocalActivityManager().startActivity("LocalProducts", intent);
View dv = null == w ? null : w.getDecorView();
if (null != dv) {
((ViewGroup) findViewById(R.id.home_content_wrapper)).addView(dv);
}
这是ActivityGroup中的代码,用于获取子活动内容并添加它。
答案 0 :(得分:1)
我发现了这个问题/getting-rid-of-the-gradient-at-the-top-of-an-activity-android,但它不适用于嵌入式活动。
<style name="Theme.EmbeddedActivity" parent="@android:style/Theme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
<activity android:name="HomeLocalProductsActivity" android:theme="@style/Theme.EmbeddedActivity" />
[edit] :我做了一个小黑客(它不是很好但是有效)。
// values/ids.xml
<resources>
<item type="id" name="embeddedcontent" />
...
</resources>
// layout/home_localproducts.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@id/embeddedcontent">
...
</RelativeLayout>
// Embedded Activity
private ViewGroup mGlobalWrapper;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.home_localproducts);
mGlobalWrapper = (ViewGroup) findViewById(R.id.embeddedcontent);
...
}
每个Activity.findViewById(id)将被mGlobalWrapper.findViewById(id)替换。在父活动中:
final Window w = getLocalActivityManager().startActivity("LocalProducts", intent);
final View dv = null == w ? null : w.getDecorView();
if (null != dv) {
View content = dv.findViewById(R.id.embeddedcontent);
((ViewGroup) content.getParent()).removeView(content);
wrapper.addView(content, 1);
wrapper.setVisibility(View.VISIBLE);
}
答案 1 :(得分:0)
看起来所有嵌入式活动都从其父活动组继承其样式。因此,如果您将样式应用于没有windowContentOverlay
的活动组,请执行以下操作:
<style name="Theme.MasterActivity" parent="@android:style/Theme">
<item name="android:windowContentOverlay">@null</item>
</style>
它将有效地应用于所有嵌入式活动,它们将摆脱烦人的阴影。不幸的是,这会消除父活动的影响,这可能不适合您的应用。
另一种方法是入侵视图层次结构,以在运行时修改嵌入式活动的相关属性。使用HierarchyViewer快速检查表明,这个令人讨厌的阴影被绘制为FrameLayout
内DecorView
的前景。 FrameLayout
本身包含我们实际的用户定义布局:
+-----------+ +-------------+ +--------------------+
| DecorView |-----| FrameLayout |-----| Your actual layout |----- ...
+-----------+ +-------------+ +--------------------+
所以任务是在中间的setForeground(null)
上调用FrameLayout
。如果我们通过luc重写最后一个例子,它将如下所示:
final Window w = getLocalActivityManager().startActivity("LocalProducts", intent);
final View dv = null == w ? null : w.getDecorView();
if (dv != null && instanceof ViewGroup) {
ViewGroup group = (ViewGroup) currentView;
if (group.getChildCount() > 0) {
View child = group.getChildAt(0);
if (child instanceof FrameLayout) {
((FrameLayout) child).setForeground(null); // die, annoying shadow!
}
}
}