Android自定義組合控件(一)

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

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

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

先上界面:

這個界面還是很常見的,很多app主頁都是這麼界面,當然下面的圖片文字等是可以自己設置的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代碼中實現自定義,下篇打算從屬性上實現自定義組合控件

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。