自定義元件研究

androidstarjack發表於2015-01-14

接下來繼續研究我們的自定義元件。

有自定義元件< 二> 可以看出declear-styleable這個Android自己給我們提供的屬性標識很重要。declare-styleable的主要作用是給自定義控制元件新增自定義屬性時用的。

比如定義一個attr.xml問價件:

<declare-styleable name="mygridview">
        <attr name="titles" format="reference|string" />
        <attr name="title_iv" format="reference"/>
        <attr name="return_icon" format="reference"/>
        <attr name="setting_icon" format="reference"/>
    </declare-styleable>

其中,format型別在上篇章節中已經提到:當format="dimension"/>來說,其屬性的名稱為"myTextSize",format指定了該屬性型別為dimension,只能表示字型的大小。

format還可以指定其他的型別比如;

reference   表示引用,參考某一資源ID string   表示字串  color   表示顏色值   
dimension   表示尺寸boolean   表示布林值  integer   表示整型值 float   表示浮點值 fraction   表示百分數 enum   表示列舉值   flag   表示位運算

例如:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.   
  4.     <declare-styleable name="lyTextView">  
  5.         <attr name="fontSize" format="dimension" />  
  6.     </declare-styleable>  
  7.   
  8. </resources>  

我們只需要在xml佈局中引入我們的自定義類即包名.類名。

<包名.類名>

  android:layout_width="fill_parent"
  android:layout_height="wrap_content"

</包名.類名>

其中,attr.xml怎樣引入呢,其是就是so easy的事了。

其中有2中方法可以用。實質上也是一種方式。即:

lyTextView:fontSize = "40dp"  lyTextView:font Size = "textsize = 40dp"  

由此可以看出,我們所自定義的屬性的引用類似於系統 的一樣,即android :fontSize = "";

因為系統的也是人寫出來的罷了,只是大牛寫出來整合到官方網上去,供我們使用而已。比葫蘆畫瓢誰不會?

另外:只要你在佈局中引入之後:例如:

public class MyGridView extends GridView{

        public MyGridView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
setGirdView();
}

  private void setGirdView() {
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                                LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
                
                setLayoutParams(params);
                setNumColumns(3);// 設定每行列數
                setGravity(Gravity.CENTER);// 位置居中
                setVerticalSpacing(1);// 垂直間隔
                setHorizontalSpacing(1);// 水平間隔
                setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
                setBackgroundColor(getResources().getColor(R.color.color));
                WindowManager windowManager = ((Activity)mContext).getWindowManager();
                Display display = windowManager.getDefaultDisplay();
                int left = dip2px(mContext, 10);
                int width_grid = display.getWidth()-2*left;
                int i = width_grid / 7;
                int j = width_grid - (i * 7);   
                int x = j / 2;
                setColumnWidth(dip2px(mContext, i+x));
                //setPadding(dip2px(mContext, 1), 0,dip2px(mContext, 1), 0);// 居中  
        }

}

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
<!-- -->
    <com.example.customgridviewdemo.view.MyGridView 
        android:id="@+id/application_gridview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

在引入我們的自定義元件之後,自動的呼叫構造方法,並可以呼叫構造方法裡的我們所定義的普通方法。

比如setGirdView();就一樣。

你當然也可以設定其他屬性,這裡我做的是自定義GridView,可以在構造方法裡面新增所有用自定義屬性的方法。

你還可以重寫其onMeasure();使其重新計算其大小。這是要根據需要加入其要重寫的幾個方法。

在以後的講解中我專門會給大家講解如何自定義GridView。來實現專案中所需要的格子布局。

老於始終堅信:

沒有做不到的,只有想不到了。


















相關文章