先贴代码:
/**
* RelativeLayout、LinerLayout以及FrameLayout布局使用对应的params
* 如:RelativeLayout.LayoutParams LinerLayout.LayoutParams
* 普通的组件(Button TextView等可以使用ViewGroup.LayoutParams)
*注:其实有的时候RelativeLayout.LayoutParams LinerLayout.LayoutParams可以混用,但是他们有各自特有的方法特性,如果
* 需要用到这个特定的方法的时候就不能够混用了。
* */
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
initView();
}
private void ConverView(){
final LinearLayout mask = new LinearLayout(this);
mask.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams maskParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
mask.setBackgroundColor(getResources().getColor(R.color.red));
Button btn = new Button(this);
final Button btn2 = new Button(this);
ViewGroup.LayoutParams btnParams = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
btn.setText("click");
btn2.setText("click2");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//mask.removeView(btn2);
//mask.removeAllViews();
//mask.setVisibility(View.GONE);
//一层一层覆盖View
ConverView();
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//一层一层的剥离View
mask.setVisibility(View.GONE);
}
});
mask.addView(btn,btnParams);
//addView是在对应的布局上增加View
mask.addView(btn2,btnParams);
//是在原有的视图上覆盖一个视图(就是这里的截图2上的)
addContentView(mask,maskParams);
//mask.removeView(btn);
}
private void initView() {
// 获取xml的RelativeLayout
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
for (int i = 0; i < 5; i++) {
//布局是LinerLayout的话这里一般就是使用LinearLayout.LayoutParams什么布局使用什么
LinearLayout.LayoutParams llParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
// 每行都有一个linearlayout
LinearLayout lLayout = new LinearLayout(this);
lLayout.setId(i + 10);
lLayout.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout.LayoutParams lLayoutlayoutParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lLayout.setLayoutParams(lLayoutlayoutParams);
TextView tv = new TextView(this);
tv.setId(i);
tv.setText("这是第" + i + "个文本框");
tv.setTextColor(Color.BLUE);
TextView tv_num = new TextView(this);
tv_num.setId(i + 20);
tv_num.setText(i + "台");
tv_num.setTextColor(Color.RED);
// 为TextView添加长高设置
ViewGroup.LayoutParams layoutParams_txt = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
tv.setLayoutParams(layoutParams_txt);
tv_num.setLayoutParams(layoutParams_txt);
// 添加到每行的linearlayout中
lLayout.addView(tv);
lLayout.addView(tv_num);
// 每个linearlayout都在前一个的下面,第一个在顶,不处理
if (i > 0) {
// relativeParams.addRule(RelativeLayout.BELOW, i + 10 - 1);
}
// 把每个linearlayout加到relativelayout中
layout.addView(lLayout, llParams);
//setContentView(layout);
}
Button btn = new Button(this);
ViewGroup.LayoutParams btnParams = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
btn.setText("覆盖View");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ConverView();
}
});
layout.addView(btn,btnParams);
//就是Activity上显示的最底层的View
setContentView(layout);
}
}
效果图:
第一步、
第二步、
第三步、不断点击click,就会不断的覆盖 颜色也会不断的加深,点击click2覆盖的View就会不断的剥离,颜色就会慢慢恢复。
主要是理解:
1、addContentView setcontentView addView
2、RelativeLayout、LinerLayout以及FrameLayout布局使用对应的params怎么选择(见代码的最上面)
注:
1、setcontentView :
使用setContentView可以在Activity中动态切换显示的View,这样,不需要多个Activity就可以显示不同的界面,因此不再需要在Activity间传送数据,变量可以直接引用。但是,在android SDK给我们建的默认的Hello World程序中,调用的是setContentView(int layoutResID)方法,如果使用该方法切换view,在切换后再切换回,无法显示切换前修改后的样子,也就是说,相当于重新显示一个view,并非是把原来的view隐藏后再显示。其实setContentView是个多态方法,我们可以先用LayoutInflater把布局xml文件引入成View对象,再通过setContentView(View view)方法来切换视图。因为所有对View的修改都保存在View对象里,所以,当切换回原来的view时,就可以直接显示原来修改后的样子。
2、addContentView setcontentView 的区别
两者的区别主要包括两点:
1). 以添加UI组件是否被移除
setContentView() 会导致先前添加的被移除, 即替换性的;
而 addContentView() 不会移除先前添加的UI组件,即是累积性的
2). 是否控制布局参数
addContentView() 有两个参数, 可以控制布局参数; 你指出的这个setContentView 没有接受布局参数,
默认使用MATCH_PARENT; 不过setContentView()也有带两个参数的版本, 可以控制布局参数。
3、addview
在原有的view上增加组件
//后期会更新从源码角度的分析