2014-05-22 106 views
3

我希望能够显示任何活动上方的任何片段覆盖。结果应该是这个样子:显示片段覆盖任何活动上面

实现这一目标将是将是无形的活动中额外的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上运行。问题是,我没有发现如何找到/得到根布局。找到根视图没有问题(activity.getWindow()。getDecorView()。getRootView()),但我需要一个ViewGroup /布局能够添加一个新的孩子。

这怎么能在Android上完成?

+1

你尝试使用'DialogFragment'? – Apoorv

+0

将叠加层放入具有透明背景的新活动中。然后开始这个活动。瞧。 – ElDuderino

回答

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