嵌入式活动之间令人不快的分隔符

时间:2011-03-04 16:27:45

标签: android activitygroup

我有一个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中的代码,用于获取子活动内容并添加它。

2 个答案:

答案 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快速检查表明,这个令人讨厌的阴影被绘制为FrameLayoutDecorView的前景。 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!
        }
    }
}