2013-02-10 7 views
8

findViewByIdによって混乱した人のために答えを書いたばかりで、私の理解にギャップがあることに気付きました。この質問は、知識と好奇心のためのものです。findViewByIdはビューをどのように初期化するのですか?

この考えてみましょう:

button = (Button)findViewById(R.id.button); 

findViewByIdは、ターゲットクラスにキャストされ、Viewのインスタンスを返します。これまでのすべての良い。

ビューを設定するために、findViewByIdは、コンストラクタに渡す関連するXML宣言のパラメータからを構成してViewにします。

次に、ViewインスタンスをButtonにキャストします。

AttributeSetは、Buttonコンストラクタに順番に渡されますか?

[EDIT]

だから私は混乱して1 :)でした。全体のポイントは、レイアウトが膨張すると、ビュー階層にはすでにビューの子孫クラスのインスタンスが含まれていることです。 findViewByIdは単に参照を返します。あなたがそれについて考えるときは明らかです -

+0

+ 5クエストオンのための質問です。あなたの質問のために私は調査して、basiに関する完全な情報を見つけましたcフロー.... @レオニードスのおかげで – Pragnani

答えて

10

findViewById何もしません。これは、ビュー階層を調べて、要求されたviewIdのビューへの参照を返します。 Viewはすでに作成されて存在します。一部のビューでfindViewByIdに電話しないと何も変わりません。

ビューは、LayoutInflatorで膨らんでいます。 setContentViewと呼ぶと、xmlレイアウトが解析され、ビュー階層が作成されます。

属性は、ボタンのコンストラクタにLayoutInflaterによって渡されます。 LayoutInflator source codeをチェックしてください。

+0

ああ、私はそれを得る。あなたは、ビューの継承を意味する、参照されたビューは、適切な子孫クラスのctorを呼び出すことによって既にインスタンス化されていますか? – Simon

+0

レイアウトインフレータによってButtonのコンストラクタに渡される属性。 [LayoutInflarotのソースコード](http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/view/LayoutInflater.java#LayoutInflater)を確認してください。 %28org.xmlpull.v1.XmlPullParser%2Candroid.view.ViewGroup%2Cboolean%29を膨張させます。 – Leonidos

+0

ありがとう、レオニードス。 – Simon

5

findViewById()は、ビューを作成またはインスタンス化するとは思わない。一致するIDを持つビューに対しては、すでに膨張したレイアウトのビュー階層内を検索します。このメソッドは、ViewViewGroupの場合とは異なる動作をします。 Androidのソースコードから

:子ビューを通じて

protected View findViewTraversal(int id) { 
    if (id == mID) { 
     return this; 
    } 
    return null; 
} 

繰り返し処理をし、これらの同じメソッドを呼び出します。

View.findViewById()は、このビューは、指定したidはnullを持っている場合、それが呼び出す同じViewオブジェクトを返します。閲覧回数:

protected View findViewTraversal(int id) { 
    if (id == mID) { 
     return this; 
    } 

    final View[] where = mChildren; 
    final int len = mChildrenCount; 

    for (int i = 0; i < len; i++) { 
     View v = where[i]; 

     if ((v.mPrivateFlags & IS_ROOT_NAMESPACE) == 0) { 
      v = v.findViewById(id); 

      if (v != null) { 
       return v; 
      } 
     } 
    } 

    return null; 
} 
+0

ビュークラスで検索すると、mIdはNo_ID ..に割り当てられます。ここでは、移動したビューIDにmIdを割り当てました – Pragnani

+0

@Pragnani 'mId'はビューの割り当てられたID。あなた/インフレータがビュー上で 'setId(int id)'を呼び出すと、 'mID'は指定されたint値に設定されます。 –

関連する問題