New UI-Java代码动态添加控件或xml布局

New UI-Java代码动态添加控件或xml布局

 ——转载请注明出处:coder-pig,欢迎转载,请勿用于商业用途!

小猪Android开发交流群已建立,欢迎大家加入,无论是新手,菜鸟,大神都可以,小猪一个人的

力量毕竟是有限的,写出来的东西肯定会有很多纰漏不足,欢迎大家指出,集思广益,让小猪的博文

更加的详尽,帮到更多的人,O(∩_∩)O谢谢!

小猪Android开发交流群:小猪Android开发交流群群号:421858269

新Android UI实例大全目录:http://blog.csdn.net/coder_pig/article/details/42145907

本节引言:

上一节我们学过了纯Java代码来加载布局,已经有了一点动态布局的基础了,本节中

我们讲解的是,在加载了xml的基础上,来动态地添加View控件!以及动态地加载XML

布局!

本节正文:

1.Java代码动态添加控件:

动态添加组件的写法有两种,区别在于是否需要先setContentView(R.layout.activity_main);

下面演示动态地为界面添加一个Button

activity_main.xml文件的布局如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/RelativeLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.jay.example.trendsinflateviewdemo.MainActivity" >

    <TextView
        android:id="@+id/txtTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="我是xml文件加载的布局"/>

</RelativeLayout>

第一种:不需要setContentView();

package com.jay.example.trendsinflateviewdemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Button btnOne = new Button(this);
		btnOne.setText("我是动态添加的按钮");
		RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        lp2.addRule(RelativeLayout.CENTER_IN_PARENT);
		LayoutInflater inflater = LayoutInflater.from(this);
		RelativeLayout rly = (RelativeLayout) inflater.inflate(
				R.layout.activity_main, null)
				.findViewById(R.id.RelativeLayout1);
		rly.addView(btnOne,lp2);
		setContentView(rly);
	}
}

第二种:需要setContentView();

package com.jay.example.trendsinflateviewdemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button btnOne = new Button(this);
		btnOne.setText("我是动态添加的按钮");
		RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        lp2.addRule(RelativeLayout.CENTER_IN_PARENT);
        RelativeLayout rly = (RelativeLayout) findViewById(R.id.RelativeLayout1);
		rly.addView(btnOne,lp2);
		setContentView(rly);
	}
}

分析总结:

代码很简单,创建按钮后,我们又创建了一个LayoutParams对象,用来设置Button的大小,又通过

addRule()方法设置了Button的位置!

第一种方法:通过LayoutInflate的inflate( )方法加载了activity_main布局,获得了外层容器,接着

addView添加按钮进容器,最后setContentView();

第二种方法:因为我们已经通过setContetView()方法加载了布局,此时我们就可以通过findViewById

找到这个外层容器,接着addView,最后setContentView()即可!

另外,关于这个setContentView( )他设置的视图节点是整个XML的根节点!

关于这个动态添加控件其实也不难,如果你看了前面那一篇<纯Java加载布局>的话,

2.Java代码动态加载xml布局

接下来的话,我们换一个,这次加载的是xml文件!动态地添加xml文件!

先写下布局文件吧:

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/RelativeLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.jay.example.trendsinflateviewdemo.MainActivity" >

    <Button
        android:id="@+id/btnLoad"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="动态加载布局"/>

</RelativeLayout>

动态加载的xml文件inflate.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:id="@+id/ly_inflate" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我是Java代码加载的布局" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我是布局里的一个小按钮" />

</LinearLayout>

接着就到我们的MainActivity.java了:

package com.jay.example.trendsinflateviewdemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//获得LayoutInflater对象;
		final LayoutInflater inflater = LayoutInflater.from(this);
		//获得外部容器对象
		final RelativeLayout rly = (RelativeLayout) findViewById(R.id.RelativeLayout1);
		Button btnLoad = (Button) findViewById(R.id.btnLoad);
		btnLoad.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//加载要添加的布局对象
				LinearLayout ly = (LinearLayout) inflater.inflate(
						R.layout.inflate_ly, null, false).findViewById(
						R.id.ly_inflate);
				//设置加载布局的大小与位置
				RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
		                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		        lp.addRule(RelativeLayout.CENTER_IN_PARENT);
				rly.addView(ly,lp);
			}
		});
	}
}

运行截图:

接下来就来分析下代码:

①获取容器对象:

final RelativeLayout rly = (RelativeLayout) findViewById(R.id.RelativeLayout1);

②获得Inflater对象,同时加载被添加的布局的xml,通过findViewById找到最外层的根节点

final LayoutInflater inflater = LayoutInflater.from(this);

LinearLayout ly = (LinearLayout) inflater.inflate(

R.layout.inflate_ly, null, false).findViewById(

R.id.ly_inflate);

③为这个容器设置大小与位置信息:

RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(

LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

lp.addRule(RelativeLayout.CENTER_IN_PARENT); 

④添加到外层容器中:

rly.addView(ly,lp);

好了,关于通过Java代码动态地添加控件或XML的内容大概就讲到这里!

另外,提醒一点,addView( )后,当这个View不需要的使用可以通过RemoveView( )将

这个View移除哦!

时间: 2024-12-28 18:55:22

New UI-Java代码动态添加控件或xml布局的相关文章

android 在布局中动态添加控件

第一步 Java代码 final LayoutInflater inflater = LayoutInflater.from(this); 第二步:获取需要被添加控件的布局 Java代码 final LinearLayout lin = (LinearLayout) findViewById(R.id.LinearLayout01); 第三步:获取需要添加的布局(控件) Java代码 LinearLayout layout = (LinearLayout) inflater.inflate( R

WPF 动态添加控件以及样式字典的引用(Style introduction)

原文:WPF 动态添加控件以及样式字典的引用(Style introduction) 我们想要达到的结果是,绑定多个Checkbox然后我们还可以获取它是否被选中,其实很简单,我们只要找到那几个关键的对象就可以了. 下面是Ui,其中定义了一个WrapPanel来存放CheckBox,还有两个按钮,用于测试相关功能. <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.c

android 动态添加控件并实现每个子控件的点击事件

需求:我们要点击进入一家店铺,根据不同的店铺,显示不同条数的子条目 如:消毒间,洗菜间等...这些都是或多或少的,所以需要动态添加: 首先自定义View(linearLayout): package cn.qust.fang.widget; import io.vov.vitamio.MediaPlayer; import io.vov.vitamio.widget.MediaController; import io.vov.vitamio.widget.VideoView; import a

winform导入导出excel,后台动态添加控件

思路: 导入: 1,初始化一个OpenFileDialog类 (OpenFileDialog fileDialog = new OpenFileDialog();) 2, 获取用户选择文件的后缀名(string extension = Path.GetExtension(fileDialog.FileName).ToLower();),并设置允许后缀文件名: 3,NPOI转datetable,遍历tatetable转成实体类列表并入库: 导出: 1, 创建提示用户保存类,SaveFileDial

DevExpress.XtraLayout.LayoutControl 动态添加控件

// Create an item within a specified group,// bound to a specified data field with the specified editorprivate LayoutControlItem CreateItemWithBoundEditor(BaseEdit editor, object dataSource,   string dataMember, LayoutControlGroup parentGroup) {   ed

asp.net动态添加控件学习

看了老师的教程后,自己一点感悟记录下来: 1.在页面提交后,动态生成的控件会丢失, 但如果生成控件的代码在pageload中,就可以,原理是每次生成页面都执行生成. 2.动态按件或页面原来控件, 在页面往返重新生成时, 都有一个特点.就是控件里面的值和状态会保留下来. 如: 在DorpDownList中动态添加了 item项, 在页面往返后, 这个项是保留下来的, 选中值selected也是保留下来的. 在CheckBox中的值,或是动态添加的CheckBox中的值,页面返回后,其中的check

Android 在布局容器中动态添加控件

这里,通过一个小demo,就可以掌握在布局容器中动态添加控件,以动态添加Button控件为例,添加其他控件同样道理. 1.addView 添加控件到布局容器 2.removeView 在布局容器中删掉已有的控件 3.使用,来个小demo就明白了 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(save

C#动态添加控件到窗体不显示

在FormLoad里面添加控件时,用this.Controls.Add()方法向窗体里面动态添加控件,调试,一直不显示,后来发现原来窗体上有一个groupbox覆盖了整个窗体,其实控件已经添加上去了,只是被遮盖了. 后面改为this.groupBox1.Controls.Add(),把控件添加到groupbox里面就不会被遮盖了 1 private void UniqueForm_Load(object sender, EventArgs e) 2 { 3 if (pFlag == 1) 4 {

QT动态添加控件

在QT中,在非构造函数中添加控件步骤如下 QPushButton *btn = new QPushButton(this); btn->setGeometry(0,0,50,50); btn->setText(“Dynamic”); btn->show();//添加本行代码,控件才能显示出来