自定義 View 中 構(gòu)造函數(shù)的調(diào)用
首先建一個(gè) class 文件命名為 MyTextView, 繼承自 View,重寫(xiě)三個(gè)構(gòu)造函數(shù),如下所示
public class MyTextView extends View {
public MyTextView(Context context) {
super(context);
}
public MyTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public MyTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
一個(gè)參數(shù)的構(gòu)造函數(shù)
一個(gè)參數(shù)的構(gòu)造函數(shù)是在代碼中創(chuàng)建對(duì)象的時(shí)候會(huì)被調(diào)用.
例如:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//創(chuàng)建對(duì)象的時(shí)候會(huì)被調(diào)用
MyTextView textView = new MyTextView(this);
}
}
兩個(gè)參數(shù)的構(gòu)造函數(shù)
兩個(gè)參數(shù)的構(gòu)造函數(shù)會(huì)在布局文件中使用這個(gè)View的時(shí)候被調(diào)用
例如:
<com.view.MyTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
三個(gè)參數(shù)的構(gòu)造函數(shù)
三個(gè)參數(shù)的構(gòu)造函數(shù)會(huì)在布局文件中使用 style 的情況下會(huì)被調(diào)用
例如:
- 現(xiàn)在 res/values/styles 文件中新建一個(gè) style
<style name="textViewDefault"> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> <item name="android:textColor">#666666</item> </style>
- 在布局文件中使用新建的 style
<com.view.MyTextView style="@style/textViewDefault" />
第三種情況一般用于: 界面中一個(gè)控件存在大量的相同的屬性的時(shí)候,可以使用這個(gè)方式來(lái)減少重復(fù)的工作量, 后期維護(hù)的時(shí)候只需要修改 style 屬性即可達(dá)到全局修改的目的.也可用于 夜間/白天 模式的切換等場(chǎng)景.
不過(guò)實(shí)際開(kāi)發(fā)中,我們一般不會(huì)這樣寫(xiě)構(gòu)造函數(shù) (直接 super 父類(lèi)), 有可能我們 A 界面是在代碼中創(chuàng)建的控件, B界面又是在布局文件中直接聲明的控件.....無(wú)法做到全部覆蓋,所以基本都會(huì)采用如下寫(xiě)法
public MyTextView(Context context) {
// 默認(rèn) super(context);
this(context,null);
}
public MyTextView(Context context, @Nullable AttributeSet attrs) {
// super(context, attrs);
this(context, attrs,0);
}
public MyTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//TODO
}
讓它們依次調(diào)用, 只需要在最后一個(gè)構(gòu)造函數(shù)內(nèi)嵌入我們想要嵌入的代碼即可.