⑴ android怎麼獲取 中的控制項
在實際開發中LayoutInflater這個類還是非常有用的,它的作用類似於findViewById()。不同點是LayoutInflater是用來找res/layout/下的xml布局文件代碼塊,並且實例化;而findViewById()是找xml布局文件下的具體widget控制項(如Button、TextView等)。 具體作用:
1、對於一個沒有被載入或者想要動態載入的界面,都需要使用LayoutInflater.inflate()來載入;
2、對於一個已經載入的界面,就可以使用Activiyt.findViewById()方法來獲得其中的界面元素。
LayoutInflater 是一個抽象類,在文檔中如下聲明:
public abstract class LayoutInflater extends Object
獲得 LayoutInflater 實例的三種方式:
1.LayoutInflater inflater = getLayoutInflater(); //調用Activity的getLayoutInflater()
2.LayoutInflater localinflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
1. LayoutInflater inflater = LayoutInflater.from(context);
其實,這三種方式本質是相同的,從源碼中可以看出:
getLayoutInflater():
Activity 的 getLayoutInflater() 方法是調用 PhoneWindow 的getLayoutInflater()方法,看一下該源代碼:
public PhoneWindow(Context context) {
super(context);
mLayoutInflater = LayoutInflater.from(context);
}
可以看出它其實是調用 LayoutInflater.from(context)。
LayoutInflater.from(context):
public static LayoutInflater from(Context context) {
LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (LayoutInflater ==null) {
throw new AssertionError("LayoutInflater not found.");
}
return LayoutInflater;
}
可以看出它其實調用 context.getSystemService()。
結論:所以這三種方式最終本質是都是調用的Context.getSystemService()。
inflate 方法 通過 sdk 的 api 文檔,可以知道該方法有以下幾種過載形式,返回值均是 View 對象,如下:
public View inflate (int resource, ViewGroup root);
3 public View inflate (XmlPullParser parser, ViewGroup root);
4 public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot);
5 public View inflate (int resource, ViewGroup root, boolean attachToRoot);
6
7 LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
8 View view = inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));
9 //EditText editText = (EditText)findViewById(R.id.content);
10 // error
EditText editText = (EditText)view.findViewById(R.id.content);
對於上面代碼,指定了第二個參數 ViewGroup root,當然你也可以設置為 null 值。
注意:
·inflate方法與 findViewById 方法不同;
·inflater 是用來找 res/layout下的 xml 布局文件,並且實例化;
·findViewById() 是找具體 xml 布局文件中的具體 widget 控制項(如:Button、TextView 等)。
⑵ Android中關於重寫方法調用父類方法的問題
重寫父類方法後,要調用父類的方法需要加super,顯示指定調用父類。
這和android沒有關系,主要是java的語法。
示例:
publicclassP{
publicvoidshow(){
}
}
publicclassSextendsP{
publicvoidshow(){
super.show();//這里顯示指定調用父類的show方法,不加super,只會調用子類的方法
}
}
本問題解決:
所以這里加了super.onKeyDown後,調用的就是父類的onKeyDown方法。
⑶ Android自定義控制項CustomView,構造函數的參數context是怎麼獲取的
很明顯,這個context是在調用構造函數的時候傳遞進來的。
以兩個參數的構造函數為例,這個一般是在xml使用該控制項後,解析xml時會調用構造方法。
那麼這個時候傳的context怎麼來的呢?從父類傳過來的,父類呢,也是從父類的父類傳過來的,頂層父類是Decorview,那麼看看Decorview的context怎麼來的。
上圖ActivityThread.java里的一個方法。
創建activity實例之前,我們會先創建context,而這個context實際上就是new 了一個ContextImpl。然後和activity綁定。所以getContext實際上就是一個ContextImpl實例。
⑷ android中獲得控制項的位置(相對於布局文件)
正確的代碼如下所示
TextViewtv=(TextView)findViewById(R.id.text);
tv.getViewTreeObserver().addOnGlobalLayoutListener(newOnGlobalLayoutListener(){
@Override
publicvoidonGlobalLayout(){
//這里執行獲取位置大小操作
intleft=tv.getLeft();
inttop=tv.getTop();
intbottom=tv.getBottom();
intright=tv.getRight();
//tv相對於父布局的坐標就得出來了
}
}
view的位置和大小是通過onLayout和onMeasure方法計算出來的,執行到activity的onCreate()方法時,尚未開始計算控制項的大小和位置,所以是取不到的
OnGlobalLayoutListener 是ViewTreeObserver的內部類,當一個視圖樹的布局發生改變時,可以被ViewTreeObserver監聽到,這是一個注冊監聽視圖樹的觀察者(observer),在視圖樹的全局事件改變時得到通知
除了OnGlobalLayoutListener ,ViewTreeObserver還有如下內部類:
interfaceViewTreeObserver.OnGlobalFocusChangeListener
當在一個視圖樹中的焦點狀態發生改變時,所要調用的回調函數的介面類
interfaceViewTreeObserver.OnGlobalLayoutListener
當在一個視圖樹中全局布局發生改變或者視圖樹中的某個視圖的可視狀態發生改變時,所要調用的回調函數的介面類
interfaceViewTreeObserver.OnPreDrawListener
當一個視圖樹將要繪制時,所要調用的回調函數的介面類
interfaceViewTreeObserver.OnScrollChangedListener
當一個視圖樹中的一些組件發生滾動時,所要調用的回調函數的介面類
interfaceViewTreeObserver.OnTouchModeChangeListener
當一個視圖樹的觸摸模式發生改變時,所要調用的回調函數的介面類
⑸ Android 調用父類
因為我們用的Activity都是繼承自Activity的,而Activity的onCreate()方法中是有一些必要的邏輯要執行的.所以我們的Activity中的onCreate()不調用super.onCreate()的話,Activity的初始化就會有問題.
有些Activity函數就不需要調用父類的同一個方法,因為父類的這些方法里留空了,就是為了讓子類復寫的.當然這類方法寫個super.XXX()也是沒錯的.
如果有興趣,可以自己翻下源碼,就明白了.
⑹ android自定義控制項繼承View,其中父類的三個構造方法有什麼區別
在代碼里new的話一般用一個參數的,
寫在xml里的 調用2個參數的 attr里邊傳過來的是 xml里邊對應的height width等參數,包括自己定義的參數,如果在xml里邊寫入自定義控制項的話 必須要重寫2個參數的構造函數
第3個參數不熟,傳style的吧貌似