Android 动态生成布局 (多层嵌套)
Android 除了能够载入xml文件,显示布局外,也能够代码生成布局,并通过setContentView(View view)方法显示布局。单独的一层布局,如一个主布局加一个控件(如Button\imageView等)动态生成代码比較简单。以下仅仅给出演示样例代码:
package com.example.android_dongtaishengcheng; import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.Toast;
import android.widget.RelativeLayout.LayoutParams; public class MainActivity extends Activity
{
RelativeLayout relativeLayout = null;
private Button button; @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
relativeLayout = new RelativeLayout(this);
LayoutParams params = new LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
relativeLayout.setLayoutParams(params);
relativeLayout.setBackgroundResource(R.color.back);
setContentView(relativeLayout); button = new Button(this);
LayoutParams params2 = new LayoutParams(300, 300);
button.setLayoutParams(params2);
params2.addRule(RelativeLayout.CENTER_IN_PARENT);
button.setText("hello");
relativeLayout.addView(button);
button.setOnClickListener(new View.OnClickListener()
{ @Override
public void onClick(View v)
{
// TODO Auto-generated method stub
startActivity(new Intent(MainActivity.this,SecondActivity.class));
}
});
}
}
以下进入重点:多层嵌套布局的动态生成。
情景描写叙述:父布局是一个线性布局,其子布局按竖直方向排列。子布局的子布局也是一个线性布局,按水平方向排列。
事实上非常easy,关键点在于。怎样控制主布局的子布局换行显示。即实现Orientation = "vertical"。能够在子布局外在加一层布局,即以下的drawParent()方法,该方法用来生成父布局的直接子布局,drawView()方法用来生成直接子布局的子布局(该布局也是多层嵌套)。能够实现例如以下图效果:
贴出代码例如以下:
/**
*
*/
package com.example.android_dongtaishengcheng;
import android.R.integer;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.LinearLayout.LayoutParams; /**
* @author zhiyuan
*
* 2014-5-29 上午10:44:44
*
*/
public class SecondActivity extends Activity
{
LinearLayout layout = null;
LinearLayout line2 = null;
LinearLayout line3 = null;
LinearLayout line4 = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
layout = new LinearLayout(this);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
layout.setLayoutParams(params);
layout.setOrientation(LinearLayout.VERTICAL);
setContentView(layout); // layout.addView(drawView(this));
line2 = (LinearLayout) drawParent(this);
line3 = (LinearLayout) drawParent(this);
line4 = (LinearLayout) drawParent(this);
for (int i = 0; i < 2; i++)
{
line2.addView(drawView(SecondActivity.this, i));
}
for (int i = 0; i < 4; i++)
{
line3.addView(drawView(SecondActivity.this, i));
}
for(int i = 0; i < 5; i++){
line4.addView(drawView(SecondActivity.this, i));
}
layout.addView(line2);
layout.addView(line3);
layout.addView(line4);
}
//生成子布局的子布局
public View drawView(Context context, int count)
{ LinearLayout layout = new LinearLayout(context);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT, 1);
params.gravity = Gravity.CENTER;
layout.setOrientation(LinearLayout.HORIZONTAL);
layout.setLayoutParams(params);
if (count == 1)
{
layout.setBackgroundResource(R.color.back);
}
RelativeLayout relativeLayout = new RelativeLayout(context);
android.widget.RelativeLayout.LayoutParams params3 = new android.widget.RelativeLayout.LayoutParams(
android.widget.RelativeLayout.LayoutParams.MATCH_PARENT,
android.widget.RelativeLayout.LayoutParams.WRAP_CONTENT);
relativeLayout.setLayoutParams(params3);
/*
* ImageView imageView = new ImageView(context); LayoutParams params2 = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
*/
Button imageView = new Button(context);
android.widget.RelativeLayout.LayoutParams params2 = new android.widget.RelativeLayout.LayoutParams(android.widget.RelativeLayout.LayoutParams.WRAP_CONTENT,
android.widget.RelativeLayout.LayoutParams.WRAP_CONTENT);
//imageView.setGravity(RelativeLayout.CENTER_IN_PARENT);
imageView.setText("測试");
params2.addRule(RelativeLayout.CENTER_IN_PARENT); // imageView.setBackgroundResource(R.drawable.ic_launcher);
imageView.setLayoutParams(params2); /*
* TextView textView = new TextView(context); LayoutParams params3 = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); textView.setText("測试专用");
* textView.setLayoutParams(params3);
*/ relativeLayout.addView(imageView);
// layout.addView(textView);
layout.addView(relativeLayout);
return layout;
}
//生成主布局的子布局
public View drawParent(Context context)
{
LinearLayout layout = new LinearLayout(context);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
// params.gravity = Gravity.CENTER_HORIZONTAL;
layout.setOrientation(LinearLayout.HORIZONTAL);
layout.setLayoutParams(params);
return layout;
} }
附Demo下载地址:http://download.csdn.net/detail/laoziyueguo3/7423939
Android 动态生成布局 (多层嵌套)的更多相关文章
- Android 动态改变布局属性RelativeLayout.LayoutParams.addRule()
我们知道,在 RelativeLayout 布局中有很多特殊的属性,通常在载入布局之前,在相关的xml文件中进行静态设置即可. 但是,在有些情况下,我们需要动态设置布局的属性,在不同的条件下设置不同的 ...
- Android -- 动态添加布局
在做项目的时候,遇到了scrollView与listView结合的使用,导致了滑动的混乱,但是有一个办法可以解决掉这个问题,就是手写listView的高度,还有另外一种方法,传送门:<Andro ...
- Android 动态生成 EditTest
这几天,开始一个项目,需要一个小效果,就是一个输入邮箱地址的EditTest 需要动态的添加.默认有两个,然后最多5个,手机的屏幕总是有限的 好的 ,这就上代码了 布局文件 <LinearLay ...
- Android 动态生成对话框和EditText
/** * (获取输入) */ private void showInputDialog() { ScrollView scrollview = getInitView() ; final Linea ...
- Android动态改变布局
遇到这么个需求,先看图: 其实是一个软件的登录界面,初始是第一个图的样子,当软键盘弹出后变为第二个图的样子,因为登录界面有用户名.密码.登录按钮,不这样的话软键盘弹出后会遮住登录按钮(其实之 ...
- 【Android自定义控件】支持多层嵌套RadioButton的RadioGroup
前言 非常喜欢用RadioButton+RadioGroup做Tabs,能自动处理选中等效果,但是自带的RadioGroup不支持嵌套RadioButton(从源码可看出仅仅是判断子控件是不是Radi ...
- Android动态添加布局
//1.利用LayoutInflater的inflate动态加载XML mLinearLayout = (LinearLayout)findViewById(R.id.LinearLayout_ID) ...
- Android中的布局优化方法
http://blog.csdn.net/rwecho/article/details/8951009 Android开发中的布局很重要吗?那是当然.一切的显示样式都是由这个布局决定的,你说能不重要吗 ...
- Android 通过Java代码生成创建界面。动态生成View,动态设置View属性。addRules详解
废话不多说,本文将会层层深入给大家讲解如何动态的生成一个完整的界面. 本文内容: Java代码中动态生成View Java代码中动态设置View的位置,以及其他的属性 LayoutParams详解 一 ...
随机推荐
- C#获取千分位,给数字加逗号分隔符
/// <summary> /// 对数字添加”,“号,可以处理负数以及带有小数的情况 /// </summary> /// <param name="vers ...
- Python文件处理(1)
读取文件 解决方案: 最简单的就是一次性读取所有的内容放在一个大字符串中 all_the_text=open('thefile.txt').read() all_the_data=open('abin ...
- 怎样学好C++语言
昨天写了一篇怎样学好C语言,就有人回复问我怎样学好C++,所以,我把我个人的一些学习经验写在这里,希望对大家实用.首先,由于怎样学好C语言中谈到了算法和系统,所以这里就仅仅谈C++语言. C++是最难 ...
- win2k/xp查看当前进程
win2k/xp查看当前进程 tasklist tasklist | find "关键字" 可以对结果进行过滤 关闭当前某个进程 taskkill /pid 程序的PID号码 wi ...
- mui如何增加自定义字体icon图标
http://ask.dcloud.net.cn/article/128 字体地址:http://www.iconfont.cn/
- NGUI: Documentation
Video Tutorials Basic Tutorial (v.2.5.0+) SD & HD atlas switching (advanced) Packed Font (advanc ...
- OO的ALV隐藏工具栏的form
OO的ALV隐藏工具栏: ***展示数据 CALL METHOD gr_alvgrid->set_table_for_first_display EXPORTING is_variant = g ...
- Boost的安装与使用(整整83篇)
http://www.cnblogs.com/lidabo/category/542245.html
- 也谈C#之Json,从Json字符串到类代码
原文:也谈C#之Json,从Json字符串到类代码 阅读目录 json转类对象 逆思考 从json字符串自动生成C#类 json转类对象 自从.net 4.0开始,微软提供了一整套的针对json进 ...
- 微信JS-SDK说明文档
http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html http://jsfiddle.net/gabrielerom ...