您的位置:首页 > 移动开发 > Android开发

Android纯代码写布局

2016-07-14 17:44 363 查看
先贴代码:

/**
* 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上增加组件

//后期会更新从源码角度的分析
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: