編輯:關於Android編程
前言:我相信”天生我才必有用”這句話,每個人都有他的作用,也許他的作用相對其他人來不是很明顯,也許他的作用也就是取悅別人,但是請不要忘記,可以通過不斷努力來發揮自己的作用,使自己的價值得到提升。
在平時的android開發中你是否遇到一個問題,那就是每次都要自己寫一個布局,或者是引入一個布局但每次都要為了給布局中的控件初始化。對於這個問題,谷歌官方推出了ActionBar,以及隨後的取代ActionBar的ToolBar來使我們的開發更加簡單,如:使用ToolBar+DrawLayout就非常容易實現推酷app的那種菜單效果。這樣的一個控件的出現極大地減少了程序員的負擔,使得android開發越來越簡單,相信以後將會有更多類似的好的控件的出現來簡化我們app的開發,呵呵,滿期待的~。
這篇文章將介紹一個自己組合的控件Titlebar來簡化我們的開發,這個組合控件的實現是個體力活(無技術含量),所以先看一下要實現的效果,如果覺得閉著眼睛就能寫出來的,可以直接跳到本篇文章結尾為我辛勤的勞動點個贊,哈哈。
效果圖:
實現這個組合控件需要我們自定義屬性,寫一個類繼承ViewGroup並在構造方法中用代碼添加子View。所以,下面先自定義我們的屬性。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjEuINfUtqjS5cr00NQ8L3A+DQo8cD7NqLn9uduy7MnPw+a1xNCnufvNvKOsztLDx7eiz9bO0sPHubLQ6NKq0tTPwjExuPbK9NDUo7o8L3A+DQpsZWZ0QnV0dG9uVGV4dCBsZWZ0QnV0dG9uVGV4dENvbG9yIGxlZnRCdXR0b25UZXh0U2l6ZSBsZWZ0QnV0dG9uSW1hZ2WjutfzsuCwtMWltcTNvMasIHRpdGxlVGV4dCB0aXRsZUNvbG9yIHRpdGxlU2l6ZSByaWdodEJ1dHRvblRleHQgcmlnaHRCdXR0b25UZXh0Q29sb3IgcmlnaHRCdXR0b25UZXh0U2l6ZSByaWdodEJ1dHRvbkltYWdlo7rT0rLgsLTFpbXEzbzGrA0KPHA+uPe49sr00NS1xNLiy7y4+b7dw/uzxr7N1qq1wMrHyrLDtNLiy7yjrMv50tSjrM7Sw8e+zdTa18rUtM7EvP5hdHRycy54bWzAtLao0uXO0sPHtcTK9NDUo7o8L3A+DQo8cHJlIGNsYXNzPQ=="brush:java;">
注意:
我們可以attrs.xml的
節點但不要format屬性;
2. 繼承ViewGroup,完成控件的組合
?觀察我們要實現的效果,發現使用ViewGroup的子類RelativeLayout可以很好和方便地完成。所以,新建一個類繼承RelativeLayout,重寫三個構造方法,在構造方法中先獲取布局中自定義屬性的值。
private void init(Context context,AttributeSet attrs) {
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.Titlebar);
mLeftButtonText = typedArray.getString(R.styleable.Titlebar_leftButtonText);
mLeftButtonTextColor = typedArray.getColor(R.styleable.Titlebar_leftButtonTextColor, Color.GRAY);
mLeftButtonSize = typedArray.getDimension(R.styleable.Titlebar_leftButtonTextSize, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
mLeftButtonImage = typedArray.getDrawable(R.styleable.Titlebar_leftButtonImage);
mTitleButtonText = typedArray.getString(R.styleable.Titlebar_titleText);
mTitleButtonTextColor = typedArray.getColor(R.styleable.Titlebar_titleColor, Color.GRAY);
mTitleButtonSize = typedArray.getDimension(R.styleable.Titlebar_titleSize, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
mRightButtonText = typedArray.getString(R.styleable.Titlebar_rightButtonText);
mRightButtonTextColor = typedArray.getColor(R.styleable.Titlebar_rightButtonTextColor, Color.GRAY);
mRightButtonSize = typedArray.getDimension(R.styleable.Titlebar_rightButtonTextSize, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
mRightButtonImage = typedArray.getDrawable(R.styleable.Titlebar_rightButtonImage);
typedArray.recycle();
}
這裡使用完TypedArray這個資源後要記得回收資源,就像使用完數據庫後要記得關閉連接和使用完IO流要記得關閉一樣。
獲取到了自定義屬性的值,那麼,我們還需要通過代碼構建左側按鈕,中間標題,右側按鈕這三個控件:
private void initView(Context context) {
if(mLeftButtonImage == null & mLeftButtonText != null){
// 當用戶沒有設置左側按鈕圖片並設置了左側的按鈕文本屬性時--添加左側文本按鈕
mLeftTextView = new TextView(context);
mLeftTextView.setText(mLeftButtonText);
mLeftTextView.setTextColor(mLeftButtonTextColor);
mLeftTextView.setTextSize(mLeftButtonSize);
RelativeLayout.LayoutParams leftParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
leftParams.addRule(RelativeLayout.CENTER_VERTICAL);
addView(mLeftTextView, leftParams);
}else if(mLeftButtonImage != null){
// 添加左側圖片按鈕
RelativeLayout.LayoutParams leftParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
leftParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
leftParams.addRule(RelativeLayout.CENTER_VERTICAL);
mLeftButton = new ImageView(context);
mLeftButton.setImageDrawable(mLeftButtonImage);
addView(mLeftButton, leftParams);
}
if(mTitleButtonText!=null){
// 添加中間標題
TextView titleTextView = new TextView(context);
titleTextView.setText(mTitleButtonText);
titleTextView.setTextColor(mTitleButtonTextColor);
titleTextView.setTextSize(mTitleButtonSize);
RelativeLayout.LayoutParams titleTextViewParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
titleTextViewParams.addRule(RelativeLayout.CENTER_IN_PARENT);
addView(titleTextView,titleTextViewParams);
}
if(mRightButtonImage == null & mRightButtonText != null){
// 當用戶沒有設置右側按鈕圖片並設置了左側的按鈕文本屬性時--添加右側文本按鈕
mRightTextView = new TextView(context);
mRightTextView.setText(mRightButtonText);
mRightTextView.setTextColor(mRightButtonTextColor);
mRightTextView.setTextSize(mRightButtonSize);
RelativeLayout.LayoutParams rightParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
rightParams.addRule(RelativeLayout.CENTER_VERTICAL);
addView(mRightTextView,rightParams);
}else if(mRightButtonImage != null){
// 添加右側圖片按鈕
RelativeLayout.LayoutParams rightParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
rightParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
rightParams.addRule(RelativeLayout.CENTER_VERTICAL);
mRightButton = new ImageView(context);
mRightButton.setImageDrawable(mRightButtonImage);
addView(mRightButton, rightParams);
}
}
說明:由於左側和右側的按鈕既可以使用文字也可以使用圖片,所以,這裡我使用了兩個控件代表這兩種情況,當用戶設置了左側按鈕圖片後就不會添加左側按鈕文本。
接下來我們還需要為左側和右側按鈕添加事件監聽,所以,我們先定義一個接口:
/**
* 在button點擊事件接口
*/
public interface OnButtonClickListener{
void onLeftClick();
void onRightClick();
}
設置按鈕監聽:
/**
* 設置點擊事件
* @param onButtonClickListener
*/
public void setOnButtonClickListener(final OnButtonClickListener onButtonClickListener) {
if(onButtonClickListener !=null){
if(mLeftTextView != null){
mLeftTextView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onButtonClickListener.onLeftClick();
}
});
}
if(mLeftButton != null){
mLeftButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onButtonClickListener.onLeftClick();
}
});
}
if(mRightTextView != null){
mRightTextView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onButtonClickListener.onRightClick();
}
});
}
if(mRightButton != null){
mRightButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onButtonClickListener.onRightClick();
}
});
}
}
}
布局中使用我們的組合控件:
include_titlebar.xml
注意:
命名空間的引入;使用我們自定義的屬性可以使用4種情況的組合:
左側為文本按鈕,右側為文本按鈕;左側為文本按鈕,右側為圖片按鈕;左側為圖片按鈕,右側為文本按鈕;左側為圖片按鈕,右側為圖片按鈕。在需要上面類似的標題欄的時候,直接在布局中include引入這個布局文件即可,然後在activity或fragment或其他使用這個控件的地方在初始化這個控件並設置接口監聽即可。在activity中初始化並設置接口監聽:
Titlebar titlebar = (Titlebar) findViewById(R.id.titlebar);
titlebar.setOnButtonClickListener(new Titlebar.OnButtonClickListener() {
@Override
public void onLeftClick() {
Toast.makeText(MainActivity.this,"左側按鈕被點擊了",0).show();
}
@Override
public void onRightClick() {
Toast.makeText(MainActivity.this,"右側按鈕被點擊了",0).show();
}
});
就是個體力活,鍛煉使用代碼創建並布局控件的能力,沒什麼可總結的~
demo下載:http://download.csdn.net/detail/ydxlt/9453262
跑馬燈效果,大家可以去原作者浏覽https://github.com/sfsheng0322/MarqueeView 下面看自定義控件的代碼public class Ma
天氣說變就變,馬上又變冷了,還好空氣不錯,陽光也不錯,早起上班的車上的人也不多,公司來的同事和昨天一樣一樣的,可能明天會多一些吧,那就再來學習android吧。學了兩個a
Android M新控件有很多,Toolbar,TabLayout,AppBarLayout,NavigationView,CoordinatorLayout,Colla
如果說評價一下哪個圖片開源庫最被廣泛使用的話,我想應該可以說是Universal-Image-Loader,在主流的應用中如果你隨便去反編譯幾個,基本都能看到他的身影,它