0

私は本当に.findViewById()メソッドとそのカスタムコンパウンドビュー作成での使用について心配しています。 nullが返されないことが保証されている正確な場所についてはわかりません。カスタムコンパウンドビューと.findViewById()

のは、私はこのカスタム化合物のビューを持っており、それがこのようないくつかの.xmlに追加されていることを言ってみましょう:

<com.app.path.TwoButtonsView 
      android:id="@+id/ok_cancel_view" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"/> 

two_buttons_view.xml

<?xml version="1.0" encoding="utf-8"?> 
<merge> 

    <LinearLayout 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" 
        android:orientation="horizontal"> 

     <TextView 
      android:id="@+id/first_button" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:clickable="true" 
      android:gravity="center" 
      android:textAllCaps="true"/> 

     <TextView 
      android:id="@+id/second_button" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:clickable="true" 
      android:gravity="center" 
      android:textAllCaps="true"/> 
    </LinearLayout> 
</merge> 

TwoButtonsView.java

public class TwoButtonsView extends LinearLayout { 

    // views 
    private TextView mFirstButtonView; 
    private TextView mSecondButtonView; 

    public TwoButtonsView(Context context) { 
     super(context); 
     init(context, null); 
    } 

    public TwoButtonsView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context, attrs); 
    } 

    public TwoButtonsView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(context, attrs); 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public TwoButtonsView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
     init(context, attrs); 
    } 

    private void init(Context context, AttributeSet attrs) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     inflater.inflate(R.layout.two_buttons_view, this); 

     // retrieve views 
     mFirstButtonView = (TextView) findViewById(R.id.first_button); // is there a chance it will return null? 
     mSecondButtonView = (TextView) findViewById(R.id.second_button); // is there a chance it will return null? 
    } 
} 

私の質問は、を呼び出した直後に.findViewById(RESOURCE_ID)nullを返す可能性がありますか?onFinishInflate()コールバックでinit()メソッドを呼び出す必要がありますか?

答えて

2

私の質問は次のとおりです。.findViewById(RESOURCE_ID) は inflater.inflate(R.layout.two_buttons_view、これ)を呼び出した後にnullを右を返すこと万が一がある

いいえ、ありさあなたが探しているビューがレイアウト内にあり、ビューの階層に明示的に追加している限り、そうではありません。最後にのループがView[]にあり、addViewで埋められています。あなたはinflatergetSystemService

+0

を呼び出して取得する必要はありませんので、

小さなノートについて

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.two_buttons_view, this); 

ViewGroupは、静的メソッドinflateを持っているあなたの答え、@Blackbeltのためにありがとうございました! 'onFinishInflate()'の目的は何ですか? –

+1

これは、レイアウトで宣言されたすべての子が追加されたときに呼び出されるコールバックです。あなたのケースでは、手動で追加しています – Blackbelt

+0

答えにもう一度おねがいします:D。 1つの最終的な質問:私はそれらを手動で追加したと言ったが、 "手動ではなく"それらを追加するもう1つの方法は何ですか?あなたがxmlでそれらを宣言したとき、私は=/ –