AndroidのLayoutInflater


本文はCSDNブログから来て、転載して出典を明記してください:http://blog.csdn.net/ghd2000/archive/2010/05/11/5579930.aspx
皆さん、こんにちは.私たちはLayoutInflaterの使用について話しています.実際に開発されたLayoutInflaterというクラスは非常に役に立ちます.findViewById()に似ています.違いはLayoutInflaterがlayoutの下でxmlレイアウトファイルを探してインスタンス化することです.findView ById()は、特定のxmlの下にある特定のwidgetコントロール(Button、TextViewなど)を探します.皆さんに分かりやすくするために簡単なデモを作りました.メインレイアウトmain.xmlにはTextViewとButtonがあります.ButtonをクリックするとDialogが表示されます.このDialogのレイアウトはlayoutディレクトリの下で定義したcustom_です.dialog.xmlファイル(中は左右に分布し、左はImageView、右はTextView).android中的LayoutInflater_第1张图片
Demoの実装手順について詳しく説明します.
1
Androidプロジェクトを新設し、LayoutInflaterDemoと名付けました.
2
、mainを修正します.xmlレイアウトは、主に元のベースにButtonを追加しました.コードは次のとおりです.
view plaincopy to clipboardprint?
<?xml version="1.0"    
encoding="utf-8"?>   
<LinearLayout    
xmlns:android="http://schemas.android.com/apk/res/android"   
    android:orientation="vertical"   
    android:layout_width="fill_parent"   
    android:layout_height="fill_parent"   
    >   
<TextView     
    android:layout_width="fill_parent"    
    android:layout_height="wrap_content"    
    android:text="@string/hello"   
    />   
<Button   
    android:id="@+id/button"   
    android:layout_width="wrap_content"   
    android:layout_height="wrap_content"   
    android:text="ShowCustomDialog"   
    />   
</LinearLayout>   

3
.ダイアログボックスのレイアウトを定義し、layoutディレクトリの下にcustom_という名前を新規作成します.dialog.xmlファイルの具体的なコードは以下の通りです.
view plaincopy to clipboardprint?
<?xml version="1.0"    
encoding="utf-8"?>   
<LinearLayout    
xmlns:android="http://schemas.android.com/apk/res/android"   
              android:orientation="horizontal"   
              android:layout_width="fill_parent"   
              android:layout_height="fill_parent"   
              android:padding="10dp"   
              >   
    <ImageView android:id="@+id/image"   
               android:layout_width="wrap_content"   
               android:layout_height="fill_parent"   
               android:layout_marginRight="10dp"   
               />   
    <TextView android:id="@+id/text"   
              android:layout_width="wrap_content"   
              android:layout_height="fill_parent"   
              android:textColor="#FFF"   
              />   
</LinearLayout>   

4
・メインプログラムの変更JAvaコードは次のとおりです.
view plaincopy to clipboardprint?
package com.android.tutor;   
import android.app.Activity;   
import android.app.AlertDialog;   
import android.content.Context;   
import android.os.Bundle;   
import android.view.LayoutInflater;   
import android.view.View;   
import android.view.View.OnClickListener;   
import android.widget.Button;   
import android.widget.ImageView;   
import android.widget.TextView;   
public class LayoutInflaterDemo extends Activity implements    
OnClickListener {   
       
    private Button button;   
    public void onCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.main);   
           
        button = (Button)findViewById(R.id.button);   
        button.setOnClickListener(this);   
    }   
    @Override   
    public void onClick(View v) {   
           
        showCustomDialog();   
    }   
       
    public void showCustomDialog()   
    {   
        AlertDialog.Builder builder;   
        AlertDialog alertDialog;   
        Context mContext = LayoutInflaterDemo.this;   
           
        //            
        ////LayoutInflater inflater = getLayoutInflater();   
        LayoutInflater inflater = (LayoutInflater)    
mContext.getSystemService(LAYOUT_INFLATER_SERVICE);   
        View layout = inflater.inflate(R.layout.custom_dialog,null);   
        TextView text = (TextView) layout.findViewById(R.id.text);   
        text.setText("Hello, Welcome to Mr Wei's blog!");   
        ImageView image = (ImageView) layout.findViewById(R.id.image);   
        image.setImageResource(R.drawable.icon);   
        builder = new AlertDialog.Builder(mContext);   
        builder.setView(layout);   
        alertDialog = builder.create();   
        alertDialog.show();   
    }   
}   

5
、最後に実行し、Buttonをクリックすると、上記の効果が得られます.次は「http://www.cnblogs.com/tt_mc/archive/2010/05/28/1746307.html”
一般的に、私たちはLayoutInflaterで一つのことをします:inflate.inflateという方法は全部で4つの形式があり,xmlで記述されたlayoutをViewに変換することを目的としている.This class is used to instantiate layout XML file into its corresponding View objects . It is never be used directly -- use getLayoutInflater() or getSystemService(String)getLayoutInflater() or getSystemService(String) to retrieve a standard LayoutInflater instance that is already hooked up to the current context and correctly configured for the device you are running on
1. Context.public abstract Object getSystemService (String name) :Return the handle to a system-level service by name. The class of the returned object varies by the requested name. 詳細については、ドキュメントを参照してください.
 
2.LayoutInflaterを得るための2つの方法
(1)システムサービスによる取得
LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
(2)与えられたcontextから取得
 
(3)両者の違い:実質は同じで、ソースコードを見てください
 
Javaコード
  • 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;    
    }  

  •  
    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;
    }

     
    3. LayoutInflater.inflate()
    LayoutファイルをViewに変換し、その名の通りLayout専用のInflaterを使用します.LayoutもViewのサブクラスですが、androidではxmlのLayoutをViewに変換して入れたい場合があります.JAvaコードでの操作は、次のコードを参照してください.次のドキュメントを見てください.
     
     
    Xmlコード
  • <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"   
        android:orientation="vertical"     
        android:layout_width="fill_parent"   
        android:layout_height="wrap_content">   
            
        <LinearLayout android:id="@+id/placeslist_linearlayout"   
            android:layout_width="fill_parent"   
            android:layout_height="wrap_content"   
            android:orientation="vertical">   
                
        </LinearLayout>       
    </ScrollView>  
     
    
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    	android:orientation="vertical" 
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content">
    	
    	<LinearLayout android:id="@+id/placeslist_linearlayout"
    		android:layout_width="fill_parent"
    		android:layout_height="wrap_content"
    		android:orientation="vertical">
    		
    	</LinearLayout>	
    </ScrollView>
     LinearLayout linearLayout 
    
    = (LinearLayout) findViewById(R.id.placeslist_linearlayout);

  • linearLayout.addView(place_type_text);
    これは実行可能で、この上のxmlでは、LinearLayoutはLayoutの代表ではなく、普通のViewにすぎません.
     
     
     
     
    4.findViewByIdには2つの形式がある
    R.layout.xxはres/layout/xxを参照します.xmlのレイアウトファイル(inflateメソッド)、R.id.xxはレイアウトファイルのコンポーネントを参照し、コンポーネントのidはxx...(findViewByIdメソッド).R.javaプロファイルを見てみましょう.Rはファイルを分類管理し、layout.をいくつか書きます.xml後、すべてのコンポーネントidはR.id.xxで表示できますが、コンポーネントはsetContentView()のlayoutでは使用できません.Activity.findView ById()に空のポインタ異常が発生します.
     
    以下にまとめます.
    View layout = inflater.inflate(R.layout.custom_dialog,null);中のパラメータはレイアウトファイルの名前です.
    LinearLayout linearLayout = (LinearLayout) findViewById(R.id.placeslist_linearlayout);lのパラメータは空間id名です.