如何在代码的任意位置为当前Activity添加View

获取当前Activity

使用ActivityLifecycleCallbacks回调获取create的Activity对象

添加View

使用Activity.addContentView(View view, ViewGroup.LayoutParams params)

移除View:Activity.removeContentView(View view)

将Content获取,在Content中手动添加View:

Content view 的ID为:android:id/content

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ActivityExt {
private final Activity mActivity;
private final ViewGroup mViewGroup;

public ActivityExt(Activity activity) {
mActivity = activity;
mViewGroup = activity.findViewById(android.R.id.content);
}

public void addContentView(View view, ViewGroup.LayoutParams params) {
mViewGroup.addView(view, params);
}

public void removeContentView(View view) {
mViewGroup.removeView(view);
}
}

在整个屏幕中添加View

上面说的addContentView是在Content中添加View,有一定的局限性,如果想在整个屏幕中添加View,不如说水印、护眼壁纸等,就需要将content上面的actionBar、stateBar也添加View。

整个屏幕中能看见的部分都来自一个总的view——DecorView

  • 获取DecorView:FrameLayout decorView = (FrameLayout) getWindow().getDecorView();
  • DecorView是一个FrameLayout,在里面直接addView(View view, ViewGroup.LayoutParams params)就可以添加View。

添加的View在整个FrameLayout布局的最上层,覆盖在Content的上面。如果添加的View有事件拦截的话,正常显示的Activity将无法获取事件消息。

添加View的需求评估

一般情况下,在Activity中手动添加View都是对整个app的页面统一添加,所以在需求评估时候需要确认使用场景,给出合理的方案,大型的app页面众多,不同的开发者为实现不同的效果,可能会对页面做不同的修改,全局添加的view在部分页面会出现崩溃。