码迷,mamicode.com
首页 > Windows程序 > 详细

WindowManager和Window添加View的区别(转)

时间:2015-04-01 19:28:04      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:

WindowManager中有个添加View的函数:

public void addView(View view, ViewGroup.LayoutParams params)

Window中有个添加View的函数:

public void addContentView(View view, ViewGroup.LayoutParams params)

弄清楚这两个类和这两个函数的作用设计到Android整个Surface系统,这里不详述,只作说明,供自己记录。

事实上,这两个函数是Activity上显示View至关重要的控制函数,它们在框架层已经有了明确的分工。查看这两个函数的调用过程可以发现addView的调用是针对ViewRootImpl的,也就是它添加的View相当于最底层的PhoneWindow.DecorView;而addContentView最终指向了ViewGroup.addView(childView)。下面用实验进行验证:

activity_main.xml

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:gravity="center"
 6     android:orientation="vertical" >
 7 
 8     <ImageView
 9         android:id="@+id/text1"
10         android:layout_width="match_parent"
11         android:layout_height="200dp"
12         android:background="#ff0088"
13         android:text="@string/hello_world" />
14 
15 </LinearLayout>

MainActivity.java

 1 public class MainActivity extends Activity {
 2 
 3     private ImageView mImageView;
 4 
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9         }
10 }

如果只有上述内容,这个Activity的效果图和View树如下:

 

技术分享 技术分享

View树和layout布局是相一致的。

现在我们使用addContentView()来添加新的内容:

 1 public class MainActivity extends Activity {
 2 
 3     private ImageView mImageView;
 4 
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9 
10         mImageView = (ImageView) this.findViewById(R.id.text1);
11         ImageView m = new ImageView(this);
12         m.setBackgroundColor(Color.BLUE);
13             getWindow().addContentView(m, new
14         ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,200));
15 16

此时它的效果图和View树如下:

 

技术分享 技术分享

我们发现,新添加的内容是和layout的根视图是平等的,这是这个使用这个函数必须要明白的,也就是说使用addContentView添加的内容等效于setContentView(R.layout.main_activity)。

现在我们使用addView()来添加新的内容:

 1 public class MainActivity extends Activity {
 2 
 3     private ImageView mImageView;
 4 
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9 
10         mImageView = (ImageView) this.findViewById(R.id.text1);
11         ImageView m = new ImageView(this);
12         m.setBackgroundColor(Color.BLUE);
13         // getWindow().addContentView(m, new
14         // ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,200));
15         WindowManager.LayoutParams wl = new WindowManager.LayoutParams();
16         wl.height = 200;
17         wl.width = WindowManager.LayoutParams.MATCH_PARENT;
18         getWindowManager().addView(m, wl);
19     }
20 }

此时它的效果图和View树如下:

技术分享

 

而且Hierarchy View工具不能显示这个View树,原因就是因为addView添加的内容等同于所有视图的根视图DecorView:

技术分享

如上,PhoneWindow$DecorView中这个DecorView是所有视图的根视图,而使用addView添加的内容等效于DecorView,明白这一点对于使用这个函数至关重要。

WindowManager和Window添加View的区别(转)

标签:

原文地址:http://www.cnblogs.com/gejs/p/4384323.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!