Android纯代码写布局
先贴代码:
/** * 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上增加组件
//后期会更新从源码角度的分析
更多相关文章
- "error: Error retrieving parent for item: No resource found
- Android中向服务器发送数据的Post和Get方法
- 图片旋转的两种方法
- 【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CP
- android sdk 兼容低版本的处理方法
- Android后端服务器的搭建方法
- 保持Android手机屏幕长亮的方法
- Android 崩溃分析 方法论