[android] 06_采用布局填充器把xml文件转换成view对象-3种方式将xml中转为view

Android 4.0

采用布局填充器把xml文件转换成view对象

3种方式将xml中转为view

一、3种方式将xml中转为view

方式一:LayoutInflater  inflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);最原始的方式

// 方式一:原始方式:Context.getSystemService("服务名")            LayoutInflater  inflater = (LayoutInflater) MainActivity. this .getSystemService(Context. LAYOUT_INFLATER_SERVICE );
             // View list_item = inflater.inflate(R.id.list_item, null);//不是id中的list_item而是layout中的list_item

            View list_item = inflater.inflate(R.layout. list_item ,  null ); // 参数2表示是否独立

方式二:LayoutInflater inflater2 = LayoutInflater.from(MainActivity.this);底层是方式一

// 方式二:LayoutInflater.from(Context)
//            LayoutInflater inflater2 = LayoutInflater.from(MainActivity.this);

//            View list_item = inflater2.inflate(R.layout.list_item, null);

底层实现:
public   static  LayoutInflater  from (Context context) {
    LayoutInflater LayoutInflater =
            (LayoutInflater) context.getSystemService(Context. LAYOUT_INFLATER_SERVICE );
     if  (LayoutInflater ==  null ) {
         throw   new  AssertionError( "LayoutInflater not found." );
    }
     return  LayoutInflater;
}
 
方式三:View list_item = View.inflate(MainActivity.this, R.layout.list_itemnull);底层是方式二和方式一
 
public   static  View  inflate (Context context,  int  resource, ViewGroup root) {
    LayoutInflater factory = LayoutInflater. from (context);
     return  factory.inflate(resource, root);
}

二、案例:ListView将一个xml变成view显示在手机上

list_view.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:orientation="horizontal" 
    >
    <TextView
        android:id="@+id/tv_personid"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:shadowColor="#ff0000"
        android:shadowDx="1"
        android:shadowDy="1"
        android:shadowRadius="1"
        android:textColor="#aa5544"
        android:textSize="17sp" />
    <TextView
        android:id="@+id/tv_personname"
        android:layout_width="10dip"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:shadowColor="#ff0000"
        android:shadowDx="2"
        android:shadowDy="2"
        android:shadowRadius="1"
        android:textColor="#009900"
        android:textSize="20sp" />
    <TextView
        android:id="@+id/tv_personphone"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:shadowColor="#ff0000"
        android:shadowDx="2"
        android:shadowDy="2"
        android:shadowRadius="1"
        android:textColor="#ff8811"
        android:textSize="20sp" />

</LinearLayout>

MainActivity.java
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import cn.zengfansheng.domain.Person;
import cn.zengfansheng.personDao.PersonDao2;
public class MainActivity extends Activity {
    private ListView lv;
    List<Person> persons = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        lv = (ListView) this.findViewById(R.id.lv);
        
        PersonDao2 pdDao2 = new PersonDao2(this);
        persons = pdDao2.findAllPersons();
        lv.setAdapter(new MyListAdapter());
    }
 
    private class MyListAdapter extends BaseAdapter {
        // 控制listview里面一共有多少个条目
        @Override
        public int getCount() {
            if (persons.size() > 0) {
                return persons.size();
            }
            return 0;
        }
        @Override
        public Object getItem(int position) {
            return null;
        }
        @Override
        public long getItemId(int position) {
            return 0;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
 
            // getCount()返回值为多少,getView()就执行几次
            // 希望把每一个条目 按照list_item去显示.
            //把list_item.xml 转化成view对象.
 
            // 一、获取一个打气筒, 布局填充器
 
            // 方式一:原始方式:Context.getSystemService("服务名")
            LayoutInflater  inflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//获取系统布局填充器的服务
            // View list_item = inflater.inflate(R.id.list_item, null);//不是id中的list_item而是layout中的list_item
            View list_item = inflater.inflate(R.layout.list_itemnull);// 参数2表示是否独立
            
            // 方式二:LayoutInflater.from(Context)
//            LayoutInflater inflater2 = LayoutInflater.from(MainActivity.this);
//            View list_item = inflater2.inflate(R.layout.list_item, null);
 
            // 方式三:
//            View list_item = View.inflate(MainActivity.this, R.layout.list_item, null);
 
            // 二、修改view对象里面的内容 在view对象里面查找孩子id
            TextView personid = (TextView) list_item.findViewById(R.id.tv_personid);
            TextView personname = (TextView) list_item.findViewById(R.id.tv_personname);
            TextView personphone = (TextView) list_item.findViewById(R.id.tv_personphone);
            
            // 三、获取当前位置的person对象
            Person person = persons.get(position);
            
            // personid.setText(person.getId());
            personid.setText(personid.getId());
            personname.setText(person.getName());
            personphone.setText(person.getPhone());
            return list_item;
        }
    }
}

结果:

三、小结:

1、xml转成view的三种方式

2、布局

a) 实现3个View水平方向LinearLayout3分1。
android:layout_width="0dip"
android:layout_weight="1"
//权重,利用这两句,可以将一个水平LinearLayout分成3等份,越大表示占据空间大
 
2)Windows下颜色定义:bgr   Android下面:rgb
 

 

3)

android:gravity="center_horizontal"  当前控件内容相对当前控件的对齐方式

android:layout_gravity 当前控件距离父控件的布局

 

4)阴影效果

android:shadowColor="#ff0000" //阴影颜色
android:shadowDx="1" //水平方向上阴影
android:shadowDy="1" //垂直方向上的阴影
android:shadowRadius="1" //阴影的半径