亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android自定義復合控件實現通用標題欄

2019-10-21 21:35:43
字體:
來源:轉載
供稿:網友

本文實例為大家分享了Android復合控件實現通用標題欄的具體代碼,供大家參考,具體內容如下

效果圖

估計大家應該和我一樣,每次去看別人博客的時候,都喜歡一拉到底,先看看有沒有效果圖,符不符合自己的需求,符合咱就繼續看,不符合免得浪費表情,所以效果圖先上為敬

Android,復合控件,標題欄

寫在前面的一點兒廢話

作為Android的菜鳥一枚,一直覺得能夠寫自定義控件是一個很炫酷的技能,最近看了徐宜生老師的群英傳之后,感覺收獲還是挺多的。這篇文章就主要記錄的是學習自定義控件中最簡單的復合控件的過程。雖然現在MD中Toolbar已經完全滿足各種各樣的需求,但對于我這種菜鳥來說自己動手寫一個還是能學到很多東西的!

1、自定義控件的屬性

既然是自定義的控件,肯定得提供屬性選項,以方便實現不同的樣式。提供自定義的屬性是很簡單的,在res資源目錄下的values目錄下創建一個attrs.xml的屬性集定義的xml文件,在該文件中自定義各種必要的屬性

<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="NormalTopBar">  <!--中間標題屬性-->  <attr name="titleText" format="string"/>  <attr name="titleTextSize" format="dimension"/>  <attr name="titleTextColor" format="color"/>  <attr name="leftText" format="string"/>  <!--左邊按鈕屬性-->  <attr name="leftTextSize" format="dimension"/>  <attr name="leftTextColor" format="color"/>  <attr name="leftImageSrc" format="reference"/>  <attr name="rightText" format="string"/>  <!--右邊按鈕屬性-->  <attr name="rightTextSize" format="dimension"/>  <attr name="rightTextColor" format="color"/>  <attr name="leftBackground" format="color"/>  <attr name="rightBackground" format="color"/>  <attr name="rightImageSrc" format="reference"/> </declare-styleable></resources>

既然自定義了屬性,就需要在自定義控件模板中去獲取這些屬性的賦值,以處理得到相應的顯示效果。在這里,系統提供了TypeArray類,獲取到該類的實例后就可通過getString()等方法獲得布局文件中設置的屬性值

 private void getTypeArray(Context context, AttributeSet attrs) {  //將attrs.xml中定義的屬性存儲到TypeArray中  TypedArray typeArray=context.obtainStyledAttributes(attrs,R.styleable.NormalTopBar);  leftText=typeArray.getString(R.styleable.NormalTopBar_leftText);  leftTextColor=typeArray.getColor(R.styleable.NormalTopBar_leftTextColor, Color.BLACK);  leftTextSize=typeArray.getDimension(R.styleable.NormalTopBar_leftTextSize,12);  leftImageId=typeArray.getResourceId(R.styleable.NormalTopBar_leftImageSrc,0);  titleText=typeArray.getString(R.styleable.NormalTopBar_titleText);  titleTextColor=typeArray.getColor(R.styleable.NormalTopBar_titleTextColor,Color.BLACK);  titleTextSize=typeArray.getDimension(R.styleable.NormalTopBar_titleTextSize,20);  rightText=typeArray.getString(R.styleable.NormalTopBar_rightText);  rightTextColor=typeArray.getColor(R.styleable.NormalTopBar_rightTextColor,Color.BLACK);  rightTextSize=typeArray.getDimension(R.styleable.NormalTopBar_rightTextSize,12);  rightImageId=typeArray.getResourceId(R.styleable.NormalTopBar_rightImageSrc,0);  typeArray.recycle();//獲取完所有屬性后需要調用recycle來避免重新創建發生的錯誤 }

參數中attrs是控件構造函數中傳入的屬性集參數,而R.styleable.NormalTopBar就是在attrs.xml文件中定義的該控件屬性集的名字。

2、動態添加控件組合成自定義符合控件

標題欄中一般包括了左邊的按鈕,中間的標題,右邊的按鈕。在本文中,我把該控件分成了5個部分,左邊有一個ImageView和一個TextView用于用戶點擊,中間有一個TextView用于顯示標題,右邊和左邊一樣,成對稱分布,然后這些控件的父控件是RelativeLayout,方便子控件的布局。了解了有哪些控件之后,就可以初始化這些控件對象,然后分別指定合適的布局,動態添加布局中。

 private void addAllView(Context context) {  leftTextView =new TextView(context);  rightTextView =new TextView(context);  titleTextView=new TextView(context);  leftImage=new ImageView(context);  rightImage=new ImageView(context);  leftImage.setId(R.id.leftimageid);  leftImage.setImageResource(leftImageId);  //leftImage.setAdjustViewBounds(true);  leftTextView.setText(leftText);  leftTextView.setTextSize(leftTextSize);  leftTextView.setTextColor(leftTextColor);  titleTextView.setText(titleText);  titleTextView.setTextSize(titleTextSize);  titleTextView.setTextColor(titleTextColor);  titleTextView.setGravity(Gravity.CENTER);//一定要設置textview內容的位置  rightTextView.setText(rightText);  rightTextView.setTextSize(rightTextSize);  rightTextView.setTextColor(rightTextColor);  rightImage.setId(R.id.rightimageid);  rightImage.setImageResource(rightImageId);  //為組建設置相應的布局  if(leftImageId!=0&&leftText!=null){   leftImageParams=new LayoutParams(dpToPx(context,35), dpToPx(context,35));   leftImageParams.addRule(ALIGN_PARENT_LEFT,TRUE);   leftImageParams.addRule(CENTER_VERTICAL,TRUE);   addView(leftImage,leftImageParams);   leftTextParams =new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);   leftTextParams.addRule(RelativeLayout.RIGHT_OF,R.id.leftimageid);   leftTextParams.addRule(CENTER_VERTICAL,TRUE);   leftTextView.setGravity(Gravity.LEFT);   addView(leftTextView, leftTextParams);  }else if(leftImageId!=0&&leftText==null){   leftImageParams=new LayoutParams(dpToPx(context,35), dpToPx(context,35));   leftImageParams.addRule(ALIGN_PARENT_LEFT,TRUE);   leftImageParams.addRule(CENTER_VERTICAL,TRUE);   addView(leftImage,leftImageParams);  }else{   leftTextParams =new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);   leftTextParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT,TRUE);   leftTextParams.addRule(CENTER_VERTICAL,TRUE);   addView(leftTextView, leftTextParams);  }  titleParams=new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);  titleParams.addRule(CENTER_IN_PARENT,TRUE);  titleParams.addRule(TEXT_ALIGNMENT_CENTER);  addView(titleTextView,titleParams);  if(rightImageId!=0&&rightText!=null){   rightTextParams =new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);   rightTextParams.addRule(RelativeLayout.LEFT_OF,R.id.rightimageid);   rightTextParams.addRule(RelativeLayout.CENTER_VERTICAL,TRUE);   rightTextView.setGravity(Gravity.RIGHT);   addView(rightTextView, rightTextParams);   rightImageParams=new LayoutParams(dpToPx(context,35), dpToPx(context,35));   rightImageParams.addRule(CENTER_VERTICAL,TRUE);   rightImageParams.addRule(ALIGN_PARENT_RIGHT,TRUE);   addView(rightImage,rightImageParams);  }else if(rightImageId!=0&&rightText==null){   rightImageParams=new LayoutParams(dpToPx(context,35), dpToPx(context,35));   rightImageParams.addRule(CENTER_VERTICAL,TRUE);   rightImageParams.addRule(ALIGN_PARENT_RIGHT,TRUE);   addView(rightImage,rightImageParams);  }else{   rightTextParams =new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);   rightTextParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,TRUE);   rightTextParams.addRule(RelativeLayout.CENTER_VERTICAL,TRUE);   addView(rightTextView, rightTextParams);  } }

這一段代碼首先是初始化得到各子控件的實例對象,然后將屬性值賦值給對應的控件,接著利用LayoutParams類對各子空間的大小和位置進行設定,最后利用addView方法即可將這些子控件添加到控件整體布局中。

這段代碼中,主要的難點在于運用LayoutParams,要注意該布局的外層viewGroup是RelativeLayout,所以在定義和初始化的時候都需要使用RelativeLayout.LayoutParams.另外LayoutParams的構造函數中的參數用于控制大小,我在設置ImageView對應的LayoutParams時,最開始把寬和高都設置為WRAP_CONTENT,但是運行后效果不理想,imageview寬度占據了一半的空間,最后決定對該控件的大小指定尺寸大小,不過要注意構造函數中的數值單位是px,所以需要先定義一個函數將dp轉為px再賦值給構造函數。

這段代碼的另外一個難點是,當我兩側的按鈕同時有文字和圖標時,對于ImageView和TextView的定位是個問題。在下面代碼中

leftTextParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT,TRUE);

這行代碼將TextView定位在了父控件的左側,而當左側同時有ImageView和TextView時二者肯定就會重疊,這肯定不是想要的結果。所以需要把ImageView仍定位在最左邊,然后TextView定位在前者的右邊,而在方法addRule()中,可以使用 addRule(RelativeLayout.RIGHT_OF,int view) 來把對應的控件定位在參數中view控件的右邊,但是該參數需要的是資源ID,可問題是在上面我們是動態添加的ImageView,并沒有在xml文件中定義id。我嘗試了直接用imageview.getId(),但得到的結果經調試發現是-1,并不能實現想要的效果,最后一搜找到了一個方法,首先在資源目錄res下的values下再新建一個ids.xml的文件,然后在文件中定義一個類型為id的item

<?xml version="1.0" encoding="utf-8"?><resources> <item name="leftimageid" type="id"/> <item name="rightimageid" type="id"/></resources>

然后利用ImageView.setId(R.id.leftimageid) 就能給動態添加的控件賦值一個不會與其他資源id重復的id,接著就可以在布局中使用。

3、定義接口暴露給調用者

到目前位置,編寫的自定義控件已經可以在xml布局文件中使用,而且也能在界面上顯示出來,但是左右兩側的按鈕點擊事件對于不同的使用者或者不同的頁面,所要完成的動作肯定是不一樣的,所以得暴露一個接口給調用者自己去實現。

public interface normalTopClickListener{  void onLeftClick(View view);  void onRightClick(View view); }

然后給調用者提供一個set函數讓調用者來實現該接口中的方法

 public void setTopClickListener(normalTopClickListener mListener){  this.mClickListener =mListener; }

最后在控件模板中,在左右控件的點擊事件里去調用接口的方法,即可得到調用者的具體實現

private void addOnClick() {  leftTextView.setOnClickListener(new OnClickListener() {   @Override   public void onClick(View view) {    mClickListener.onLeftClick(view);   }  });  leftImage.setOnClickListener(new OnClickListener() {   @Override   public void onClick(View view) {    mClickListener.onLeftClick(view);   }  });  rightTextView.setOnClickListener(new OnClickListener() {   @Override   public void onClick(View view) {    mClickListener.onRightClick(view);   }  });  rightImage.setOnClickListener(new OnClickListener() {   @Override   public void onClick(View view) {    mClickListener.onRightClick(view);   }  }); }

github源碼

結語

終于寫完了第一篇博客,說句實在的,第一次寫起來感覺真不簡單。如果文中有任何錯誤或者建議,歡迎指出,不勝感激

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品电影在线观看| 91九色视频导航| 亚洲欧洲中文天堂| 亚洲精品欧美日韩| 欧美国产第二页| 国产精品日韩一区| 色悠悠久久久久| 亚洲毛片一区二区| 日韩精品在线影院| 国产成人精彩在线视频九色| 亚洲精品456在线播放狼人| 97视频免费在线观看| 成人深夜直播免费观看| 欧美日韩中文在线观看| 2019av中文字幕| 狠狠久久亚洲欧美专区| 国内精品久久久久久久| 国产精品大片wwwwww| 久久久免费高清电视剧观看| www.亚洲成人| 91在线免费视频| 91精品综合久久久久久五月天| 精品自拍视频在线观看| 欧美日韩精品在线播放| 欧美伊久线香蕉线新在线| 亚洲一区二区福利| 日韩精品免费视频| 欧美丝袜美女中出在线| 久久精品欧美视频| 国产欧美在线播放| 欧美日韩亚洲一区二区三区| 日韩中文字幕国产| www国产精品视频| 欧美日产国产成人免费图片| 91成人国产在线观看| 亚洲免费人成在线视频观看| 欧美专区国产专区| 少妇高潮久久久久久潘金莲| 国产精品∨欧美精品v日韩精品| 免费不卡欧美自拍视频| 国产精品免费一区二区三区都可以| 日韩久久精品成人| 奇米四色中文综合久久| 一区二区三区 在线观看视| 91精品啪aⅴ在线观看国产| 成人性生交大片免费看小说| 97视频免费在线观看| 日韩经典中文字幕在线观看| 久久免费精品日本久久中文字幕| 久久成人人人人精品欧| 日韩美女主播视频| 青青草国产精品一区二区| 欧美日韩亚洲精品一区二区三区| 色综久久综合桃花网| 91av视频在线播放| 欧美激情在线观看| 欧美国产第二页| 欧美国产在线电影| 午夜免费久久久久| 亚洲男人的天堂网站| 久久精品电影一区二区| 国产a∨精品一区二区三区不卡| 国产精品久久97| 日韩欧美在线中文字幕| 欧美激情a∨在线视频播放| 久久好看免费视频| 久热精品视频在线免费观看| 欧美日韩成人在线观看| 狠狠躁夜夜躁人人爽超碰91| 自拍视频国产精品| 亚洲嫩模很污视频| 亚洲第一精品久久忘忧草社区| 日韩免费看的电影电视剧大全| 另类少妇人与禽zozz0性伦| 国内外成人免费激情在线视频| 亚洲一区美女视频在线观看免费| 久久久午夜视频| 欧美国产日韩一区| 久久国产精品久久久| 精品精品国产国产自在线| 91久久精品美女高潮| 伊人伊人伊人久久| 浅井舞香一区二区| 久久久久亚洲精品国产| 疯狂蹂躏欧美一区二区精品| 91精品视频专区| 亚洲激情在线观看| 91av视频在线免费观看| 92福利视频午夜1000合集在线观看| 亚洲影院高清在线| 免费91在线视频| 国模精品视频一区二区| 国产丝袜一区二区三区| 欧美激情一区二区三区成人| 日韩欧美精品免费在线| 欧美中文字幕精品| 日韩av在线资源| 亚洲精品久久久久中文字幕欢迎你| 亚洲精品久久久久国产| 欧美日韩国产丝袜美女| 精品精品国产国产自在线| 亚洲色图综合网| 91色琪琪电影亚洲精品久久| 亚洲 日韩 国产第一| www.日韩系列| 亚洲色图校园春色| 在线看国产精品| 欧美激情欧美激情在线五月| 中文字幕亚洲欧美日韩在线不卡| 欧美电影在线观看网站| 中文字幕亚洲专区| 亚洲aⅴ日韩av电影在线观看| 97视频在线免费观看| 欧美激情成人在线视频| 九九久久综合网站| 精品偷拍各种wc美女嘘嘘| 亚洲成年人在线播放| 日韩欧美中文字幕在线播放| 性欧美视频videos6一9| 91夜夜揉人人捏人人添红杏| 亚洲国产精品美女| 欧美有码在线观看| 韩国美女主播一区| 欧美日韩黄色大片| 亚洲精品资源美女情侣酒店| 国产视频亚洲精品| 国产成人精品视| 亚洲电影免费观看高清完整版| 欧美精品www在线观看| 亚洲一二在线观看| 欧美成人小视频| 92看片淫黄大片看国产片| 亚洲国产精品va在线看黑人动漫| 亚洲最大的免费| 米奇精品一区二区三区在线观看| 欧美xxxx18性欧美| 久久视频在线视频| 日韩视频欧美视频| www.欧美精品| 欧美成人全部免费| 日韩亚洲一区二区| 亚洲直播在线一区| 国产一区欧美二区三区| 国产成人在线亚洲欧美| 中文字幕久热精品视频在线| 国产日韩在线播放| 亚洲电影免费在线观看| 欧美精品一本久久男人的天堂| 91社区国产高清| 国产精品久久久久久av福利| 日韩精品999| 91香蕉亚洲精品| 毛片精品免费在线观看| 日韩精品日韩在线观看| 97在线观看视频国产| 国产精品999999| 色婷婷综合成人| 中文字幕久久久| 欧美亚洲视频在线看网址| 精品国产乱码久久久久酒店| 亚洲 日韩 国产第一| 97国产suv精品一区二区62| 亚洲国产天堂网精品网站| 国产网站欧美日韩免费精品在线观看|