Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android自定義組合控件(一)

Android自定義組合控件(一)

編輯:關於Android編程

最近參加濟南一分享會,感受頗深,也很欣賞大神們的分享精神,好東西大家一起分享

不能做只會搬磚的碼農,要成為一個真正的程序員,當然我是媛,程序員分為三類,初級程序員,中級程序員,高級程序員,也不能總是做個小菜鳥,那也太沒有追求了,為了我的大神夢,開始學習自定義控件

本博客從最簡單的開始,先來介紹自定義組合控件,在我看來自定義空間中組合控件是最簡單的,這裡拿最常見的圖片和文字組合來說明

先上界面:

\

這個界面還是很常見的,很多app主頁都是這麼界面,當然下面的圖片文字等是可以自己設置的<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+z8LD5srH19S2qNLl1+m6z7/YvP61xNb30qq0+sLrOjwvcD4KPHA+ytfPyMrHvMyz0NfUTGluZWFyTGF5b3V019S2qNLlv9i8/jwvcD4KPHA+PHByZSBjbGFzcz0="brush:java;">package com.sdufe.thea.guo.view; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.sdufe.thea.guo.R; public class CustomView extends LinearLayout { private ImageView mImageView; private TextView mTextView; Context context; public CustomView(Context context) { super(context,null); } public CustomView(Context context, AttributeSet attrs) { super(context, attrs); this.context=context; View view=LayoutInflater.from(context).inflate(R.layout.custom_view, this,true); mTextView=(TextView) view.findViewById(R.id.custom_textview); mImageView=(ImageView) view.findViewById(R.id.custom_imageview); } public void setText(String text){ mTextView.setText(text); } public void setTextColor(int color){ mTextView.setTextColor(color); } public void setTextSize(float size){ mTextView.setTextSize(size); } public void setImagViewResouce(Drawable drawable){ mImageView.setImageDrawable(drawable); } }

然後是自定義控件的布局文件



    
    
    
    

最後是對自定義控件的使用



    

        

        

        

        
    


package com.sdufe.thea.guo;

import com.sdufe.thea.guo.view.CustomView;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Toast;

public class MainActivity extends Activity {
	
	private CustomView mCustomView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);
		
		initView();
	}

	private void initView() {
		mCustomView=(CustomView) findViewById(R.id.custom);
		mCustomView.setText("我是大壞蛋");
		mCustomView.setTextColor(getResources().getColor(R.color.text_color));
		mCustomView.setImagViewResouce(getResources().getDrawable(R.drawable.phone));
		
		mCustomView.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Toast.makeText(getApplicationContext(), "別點我", Toast.LENGTH_LONG).show();
			}
		});
	}

}

以上就是全部代碼了,這裡講一下我遇到的問題,一般我在填充布局的時候都用LayoutInflater.from(context).inflate(resource, root),可是自定義時,它就是顯示不出來,本著程序員精神,就使勁去查,查了查源碼,換成LayoutInflater.from(context).inflate(R.layout.custom_view, this,true);就可以了,恩,成功顯示出來了,挺開心,順便看了看源碼

一般LayoutInflater.from(context).inflate(resource, root),第一個參數就是要加載的布局id,第二個參數是指給該布局的外部再嵌套一層父布局,如果不需要就直接傳null,但是這裡要用到他的屬性,明顯不滿足,那就只能用有三個參數的了,那就來說一說三個參數的LayoutInflater.from(context).inflate(R.layout.custom_view, this,true);第一個參數還是加載的布局id,第二個參數是指給該布局的外部再嵌套一層父布局,第三個官方說attachToRoot Whether the inflated hierarchy should be attached to the root parameter? If false, root is only used to create the correct subclass of LayoutParams for the root view in the XML.中文意思就是attachToRoot無論充氣層次應附加到根參數?如果為假,根僅用於創建的LayoutParams正確的子類中的XML根視圖.

public View inflate(int resource, ViewGroup root, boolean attachToRoot) {
        if (DEBUG) System.out.println("INFLATING from resource: " + resource);
        XmlResourceParser parser = getContext().getResources().getLayout(resource);
        try {
            return inflate(parser, root, attachToRoot);
        } finally {
            parser.close();
        }
    }
當繼續追蹤第五行代碼,你就會知道其實他的實質是利用XML中的Pull解析,這裡先暫時放一放,只是說明一下這三個參數

1.當root為空時,attactRoot無效

2.當root不為空時,attachRoot為TRUE會加載布局文件的在外層root

3.當root不為空,attachroot為FALSE時,不會加載最外層的布局文件

ok,就先介紹這些,本博客主要是從Java代碼中實現自定義,下篇打算從屬性上實現自定義組合控件


代碼下載地址:http://download.csdn.net/detail/elinavampire/8141963

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved