将片段显示为任何活动上方的叠加层

时间:2014-05-22 11:50:10

标签: android android-layout android-fragments

我希望能够将任何片段显示为任何活动上方的叠加层。结果应如下所示:

实现这一目标的最简单方法是在不可见的活动中放置一个额外的FrameLayout。当应该显示叠加层时,它可以放在FrameLayout中,然后设置为可见。

这样可以正常工作,但当然只能在准备这样做的活动中使用。此外,这不会覆盖操作栏。我正在寻找一种更通用的方法。像这样:

// In Activity
public void showFragmentOverlay() {
   SomeFragment someFragment = new SomeFragment();
   FragmentOverlay overlay = new FragmentOverlay(this, someFragment);
   overlay.show();
}

// Overlay class
public class FragmentOverlay {
    private Activity activity;
    private Fragment fragment;

    public FragmentOverlay(Activity activity, Fragment fragment) {
        this.activity = activity;
        this.fragment = fragment;
    }

    private FrameLayout frameLayout;
    public void show() {
        // Find root view/layout somehow
        // Create FrameLayout programmatically and place it in the root layout
        // Add Fragment to FrameLayout
    }

    public void close() {
        // Remove FrameLayout from root layout
    }
}

我在iOS上使用一个非常相似的解决方案,只需将视图直接添加到窗口以覆盖所有其他视图。但是我无法在Android上运行。问题是,我没有发现如何查找/获取Root-Layout。查找Root视图没问题(activity.getWindow()。getDecorView()。getRootView())但我需要一个ViewGroup / Layout才能添加一个新的子项。

如何在Android上完成?

1 个答案:

答案 0 :(得分:1)

您可以尝试以下操作:

 View mTopView = getLayoutInflater().inflate(R.layout.activity2, null);
    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            getResources().getDisplayMetrics().widthPixels,
            getResources().getDisplayMetrics().heightPixels,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
            PixelFormat.TRANSLUCENT);


    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    wm.addView(mTopView, params);

您需要在清单中添加此权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>