본문 바로가기

Android

[안드로이드] LayoutInflater inflate 사용하기

1. LayoutInflater ?


안드로이드에서  어떤 뷰가 화면에 보일려면 반드시 객체화(인스턴스) 되어 있어야 하는데요.

안드로이드에서 뷰 객체를 생성하는 과정은 크게 2가지가 있습니다.

 

직접 코드상에서 아래와 같이 생성하는 방법이 있고

Button b = new Button(this)   // this 는 Context 를 의미

그리고 xml 파일을 통해서 객체를 생성하는 방법이 있습니다.


인플레이트라는 것은 xml 파일을 통해서 객체화를 시키는 것을 말합니다.


2. LayoutInflater 사용시 주의 사항


LayoutInflater inflate 사용할때 parameter의 의미에 주의해서 처리해야합니다. 


        String service = Context.LAYOUT_INFLATER_SERVICE;
        LayoutInflater li = (LayoutInflater)getContext().getSystemService (service);


        LinearLayout ll =(LinearLayout)li.inflate (R.layout.region_main_header, this, false);

       addView(ll);


       또는

        LinearLayout ll =(LinearLayout)li.inflate (R.layout.region_main_header, this, true);

       

this 는 attach할 rootViewGroup 이다

true,false는 attach여부


안드로이드 help

View inflate(int resource, ViewGroup root)
Inflate a new view hierarchy from the specified xml resource.
View inflate(XmlPullParser parser, ViewGroup root)
Inflate a new view hierarchy from the specified xml node.
View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot)
Inflate a new view hierarchy from the specified XML node.
View inflate(int resource, ViewGroup root, boolean attachToRoot)
Inflate a new view hierarchy from the specified xml resource.


3. LayoutInflater 사용예


1) 암시적으로 사용됨


    public void onCreate(Bundle savedInstanceState){    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);

       ....

   }


setContentView내부에서  LayoutInflater 사용 

     li.inflate (R.layout.home, this, true);



2) 리스트뷰의  커스텀 BaseAdapter에서  객첵화 해야 하는 경우 사용


private class TableListAdapter extends BaseAdapter {

    private LayoutInflater mInflater


    TableListAdapter() {
         mInflater = (LayoutInflater)

           getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);     }
    }

              @Override
              public View getView(int position, View convertView, ViewGroup parent) {
                   if (convertView == null) {
                       convertView = mInflater.inflate(R.layout.home_list_row, parent, false);
                    }

                    ......

                    return convertView;

                 }

            }


3) 커스텀뷰를 만들어 사용하는 경우


public class VideoThumbView extends RelativeLayout {

    RemoteImageView mImageView;
    
    public VideoThumbView(Context context) {
        super(context);
        create(context);
    }
    
    public VideoThumbView(Context context, AttributeSet attrs) {
        super(context, attrs);
        create(context);
    }
    
    private void create(Context context)
    {
        String service = Context.LAYOUT_INFLATER_SERVICE;
        LayoutInflater li = (LayoutInflater)context.getSystemService (service);
        li.inflate (R.layout.video_thumb, this, true);
        
        mImageView = (RemoteImageView )findViewById(R.id.video_thumb_image);
        mImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    }

}



4) XML 리소를 객체화 하여 사용하는 경우


    private void setLayout() {
        mTableListView=(ListView)findViewById(R.id.home_table_list);

        mInflater = (LayoutInflater)getSystemService (Context.LAYOUT_INFLATER_SERVICE);
        mHeaderView = mInflater.inflate(R.layout.home_list_header,mTableListView, false);
        
        mImagePageLabel=(TextView)mHeaderView.findViewById(R.id.home_image_page);
        mImageGallery=(Gallery)mHeaderView.findViewById(R.id.home_image_slide);
        mImageTextLabel=(TextView)mHeaderView.findViewById(R.id.home_image_text);       
        mVideoPageLabel=(TextView)mHeaderView.findViewById(R.id.home_video_page);
        mVideoGallery=(FilingGallery)mHeaderView.findViewById(R.id.home_video_slide);
        mTableListView.addHeaderView(mHeaderView);
    }