неприятный разделитель между вложенными действиями - PullRequest
1 голос
/ 04 марта 2011

У меня 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 ]

1 голос
/ 07 марта 2011

Я нашел этот вопрос / Как избавиться от градиента на верхней части-активности-андроида , но он не работает для встроенной активности.

<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" />

[править] : я сделал небольшой хак (это не очень хорошо, но работает).

// 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);
}
0 голосов
/ 12 апреля 2011

Похоже, что все вложенные действия наследуют свой стиль от родительской группы действий. Итак, если вы применяете стиль к группе действий, у которой нет windowContentOverlay, например:

<style name="Theme.MasterActivity" parent="@android:style/Theme">
    <item name="android:windowContentOverlay">@null</item>
</style>

Он будет эффективно применяться ко всем вложенным действиям, и они избавятся от надоедливой тени. К сожалению, это удаляет эффект от родительской активности, который может плохо выглядеть для вашего приложения.

Другой подход - взломать иерархию представления, чтобы изменить свойство relevent внедренных действий во время выполнения. Быстрый осмотр с помощью 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!
        }
    }
}
...