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详解 一 ...
随机推荐
- UVA 11292 - The Dragon of Loowater (water)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=sh ...
- 在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH
原文 在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH 在项目中关于DataGrid的遇到过一些问题,其中是关于迁入CheckBox的双向 ...
- php连接oracle及简单操作
使你的php支持oracle,按照以下步骤即可: 1.安装php环境,找一下appserv或者xampp,一键安装,很方便 2.把php的ext目录下的php_oci8.dll拷到system32目录 ...
- Matlab,Visio等生成的图片的字体嵌入问题解决方法
确保所有字体嵌入,是生成高质量学术论文的必要条件.但是在Windows下,总会遇到Matlab或Visio生成字体没有嵌入的问题,当然这个问题的解决办法有很多(例如,对于Visio可以这样做:直接拷贝 ...
- 公钥password学中的素数以及对称加密
password学.一向被人们觉得门槛非常高,特别高端...这也是实际,可是这决不意味着普通人无法了解它的精髓.对于喜欢画圆的人来讲,即便是理解了password技术背后的哪怕一点理论,也是激 ...
- C# 验证识别基类
原文C# 验证识别基类 网上找了些代码 自己又改了下 先放出来了 处理简单的验证码足够了 001 using System; 002 using System.Collections.Generic; ...
- 10165 - Stone Game(Nim游戏)
UVA 10165 - Stone Game 题目链接 题意:给定n堆石子,每次能在一堆取1到多个.取到最后一个赢,问谁赢 思路:就裸的的Nim游戏,利用定理求解 代码: #include <s ...
- C语言中 struct成员变量顺序对内存的占用
在C语言的结构体中,是会按照其变量类型来进行分配内存大小的.但是对于不同的编译器,结果是不同的,在VC++6.0中是怎么个分配情况呢?用一下C中的关键字sizeof()来测试下,注意sizeof()不 ...
- hdoj 2066 一个人的旅行 【多源多汇最短路】
题目:hdoj 2066 一个人的旅行 方法:缩点 + 最短路 分析:看了大神的一篇博客,讲冗余压缩的,然后就想找一个多源最短路练练手. 这个题目就是典型的多源多汇最短路 方法:把全部的源点压缩成一个 ...
- 全局忽略编译警告(设置QMAKE_CXXFLAGS )
msvc编译器从2010 sp1开始就已经支持UTF-8的源码文件了,然后到vs2012又不支持了,官方表示是BUG.到目前最新的vs2013就解决了这个问题... 但是在编译时仍然会出现4819的警 ...