Android 添加子视图(addView和setView)

我们在添加视图文件的时候有两种方式,一种是通过在xml文件定义layout,另一种方式是在java代码中动态生成布局文件。

在xml中定义的layout要想转化为view,需要使用到LayoutInflater类。

1.构造xml文件

2.LayoutInflater

提到addview,首先要了解一下LayoutInflater类。这个类最主要的功能就是实现将xml表述的layout转化为View的 功能。为了便于理解,我们可以将它与findViewById()作一比较,二者都是实例化某一对象,不同的是findViewById()是找xml布 局文件下的具体widget控件实例化,而LayoutInflater找res/layout/下的xml布局文件来实例化的。

(1)创建

LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);或
LayoutInflater inflater = LayoutInflater.from(Activity.this);或
LayoutInflater inflater = getLayoutInflater();

这三种方法本质是相同的。

(2)inflate()

用LayoutInflater.inflate() 将LayOut文件转化成VIew。

View view = inflater.inflate(R.layout.login, null);

3.添加视图文件

举个例子,假如定义了一个toast,则可以设置视图文件

toast.setView(view);

现在给出一个常用的toast的例子--让带图片和文本的toast居中显示,看代码:

其中主文件只放置了一个button,xml文件就不赘述。

package com.cn.query;

import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.androidquery.AQuery;

public class AQueryTest2 extends Activity {
AQuery aq = new AQuery(this);
private Button button;

protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.test1);
aq.id(R.id.button1).visible().clicked(this, "click");
}

public void click() {
// 动态生成布局视图--适用于简单布局
Toast toast = new Toast(AQueryTest2.this);
toast.setDuration(3000);
// 设置重心--让toast居中显示
toast.setGravity(Gravity.CENTER, 0, 0);
LinearLayout ll = new LinearLayout(AQueryTest2.this);
ImageView iv = new ImageView(AQueryTest2.this);
iv.setImageResource(R.drawable.icon1);
// 设置图片内边距,使textview显示在右侧,避免重叠
iv.setPadding(0, 0, 15, 0);
// 布局属于ViewGroup,可以调用添加视图方法
ll.addView(iv);
TextView textview = new TextView(AQueryTest2.this);
textview.setText("我是创建消息的提示框");
//
ll.addView(textview);
toast.setView(ll);
toast.show();
}

public void click2() {
// 动态生成布局视图--适用于复杂UI布局
Toast toast = new Toast(AQueryTest2.this);
toast.setDuration(3000);
// 设置重心
toast.setGravity(Gravity.CENTER, 0, 0);
// 创建inflater
LayoutInflater inflater = getLayoutInflater();
// 通过inflate方法将layout转化为view
View view = inflater.inflate(R.layout.toast, null);
// 设置视图--Toast继承自Widget,不是容器,只能调用设置视图方法
toast.setView(view);
toast.show();
}
}

click()方法是动态生成的布局,就不多说了。注意ll.addView(iv)这里用的是addView,因为LinearLayout继承自ViewGroup,所以是个容器,容器添加视图则用addView().

click2()方法时将layout定义在xml文件,然后通过LayoutInflater类的实例化对象 inflater调用inflate方法将layout转化为view。注意toast.setView(),Toast是widget,不是容器,只能 用setView()设置视图。

click2()方法中使用的布局文件:
toast.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_vertical|center_horizontal"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/imageview3"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="0px"
        android:paddingLeft="0px"
        android:paddingRight="5px"
        android:paddingTop="0px"
        android:src="@drawable/icon1" />

    <TextView
        android:id="@+id/textview3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="消息提示" />

</LinearLayout>
 

除此之外上面还用到的Android Aquery轻量级插件。需要导入相应的包就可。

效果截图:

时间: 2024-11-07 14:52:44

Android 添加子视图(addView和setView)的相关文章

精通IOS-在表单元中添加子视图

#import <UIKit/UIKit.h> @interface NameAndColorCellTableViewCell : UITableViewCell @property(copy,nonatomic) NSString *name; @property(copy,nonatomic) NSString *color; @end NameAndColorCellTableViewCell.h // // NameAndColorCellTableViewCell.m // Tab

新浪微博开发-添加子视图控制器&amp;设置颜色

一.添加子视图控制器 二.设置颜色 设置颜色:两种方法 一种较为繁琐,详见视频 第二种: //设置颜色 self.tabBar.tintColor = UIColor.orangeColor()

关于cell中添加子视图 复用重叠问题的解决方法

问题本质: 因为你要添加的子视图并不是在自定义的cell中实现的,而是根据系统给的UITableViewCell这个类创建的实例,每次进图 cellForRow方法都会创建一个cell,每次都要创建一个子视图添(button,label之类的)加进去,会给占用很大的内存,所以采用了复 用的方法,但是问题就来了,当cell超出界面,从队列中拿过来复用的时候,其中子视图的内容并没有消除,这样你会原来的基础上再创建一个子视图添加上去 遮住了原来的视图,一般视图都是透明的这样的话就变成了一层层的叠加.

iOS开发-自定义重用机制给ScrollerView添加子视图

其实这个问题我很早就想过,只是没有通过去敲代码实现,昨天有人提起,我就巧了一下 不知道大家打印郭tableview:cellforrow中cell初始的次数,也就是重用池中的cell个数,这个是固定的,比如屏幕最多可以显示4个cell那么重用池个数可能为5个6个或者7左右,我就想了如果scrollview去实现,子视图也应该是有一个个数的,那么如何去实现重用池呢?我想到了数组,可变数组,我在loadview中将scrollview的可滑动区域设置为10000,然后给scrollview每隔20个

在UIViewController的view上添加子视图不显示

第一种方式:通过代码方式创建视图控制器UIViewController,添加子视图,需要留意创建视图的size,如果是为0是看不到的 第二种方式:xib或storyboard方式创建视图控制器UIViewController,需要留意xib是否与视图变量之间建立的关系,没有建立关系子视图是添加到视图view中,但是就是不能系显示. 如图:

iOS自定义alertView,继承自UIView,可以添加子视图,标题图片+文字

自定义alertView,继承自UIView,可以在消息区域添加子视图:addCustomerSubview 标题可以有图片+文字构成, 只支持两个按钮操作 // - 在需要alert的控制器调用 alertView show 方法 CustomAlertView *alertView = [[CustomAlertView alloc] initWithTitle:@"提示" message:@"dylan_lwb_" delegate:self cancelBu

UIView 添加子视图的常用方法

1.  - (void)addSubview:(UIView *)view 这是最常用的方法有两个注意点 参数view可以是nil,运行不会报错,当然,父视图的subViews也不会增加. 此方法增加的view层级当前是最高的,也就是最靠外. 2.  - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index; 父视图的所有的子视图的index默认是从0开始的. index如果赋了负数,执行不会报错,但添加会失败. 如果index值

动态添加子视图 UIView 的正确方法

很多时候哥比较喜欢用代码添加视图,特别是要同时加很多UIView时,而且跟 xib 比起来代码更容易管理,在多人的项目中代码不容易 conflict. 但小牛哥最近发现很多新人都不太清楚正确的使用方法,以下是哥的一些总结,有何不妥欢迎大家一起讨论: (前提条件是这样的:有一个 View Controller  和相应的 xib 文件,我们需要为这个controller 动态加上其他的子视图) UIViewController 中动态添加 UIView 正确的步骤应该是: 1. 在 viewDid

scrollview上添加子视图,在第一个视图右滑显示时右滑调用某个方法

1.设置scrollview没有反弹效果 scrollview.bounces = NO; 2.在scrollview上添加很多控制器的view,在滑动到最左侧(第一个)view时,再右滑不在是反弹效果,而是调用某个方法时: 步骤1:重写scrollview类,在scrollview类里有个 -(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 方法 例如 -(BOOL)gestureRecogn