2012-03-10 24 views
17

誰がonFinishInflate()を呼び出しますか?どんなに私のレイアウトファイル(コード内)を膨らませても、このメソッドは決してトリガされないようです。 onFinishInflate()が実際に呼び出されたときに、誰かに私に例を与えたり教えてもらえますか?onFinishInflate()は呼び出されません

答えて

30

View.onFinishInflate()ビュー(およびその子)がXMLから拡張された後に呼び出されます。具体的には、LayoutInflater.inflate(...)へのコール中にonFinishInflate()が呼び出されます。インフレは、ルートから始まり、再帰的に実行されます。子供を含むビューは、その子供がいつ膨張したかを知る必要があるかもしれない。このコールバックの主な用途の1つは、ViewGroupsがその子が準備ができたら特別なアクションを実行することです。

というサブクラスがあり、CustomViewと呼ばれ、レイアウト自体が内部的に膨らんでいないとします。あなたのレイアウトでCustomViewどこか、すなわちを持っていた場合:それが膨張された後

... 
<com.company.CustomView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 
... 

あなたはonFinishInflate()にコールバックが表示されます。これがあなたの活動のメインレイアウトにある場合は、Activity.setContentView(int)が呼び出された後であるとみなすことができます。内部的にはLayoutInflater.inflate(...)となります。あなたがCustomViewのインスタンスを作成した場合

また、:

... 
new CustomView(context); 
... 

...あなたはonFinishInflate()への呼び出しを取得することはできません。このようにインスタンシエートすると、自然にそれが子を持​​たないため、XMLインフレーションのように再帰的にインスタンス化されるのを待つ必要はありません。

+6

したがって、ドキュメントは間違っています。手動でレイアウトを膨張させると、コールバックは呼び出されません。しかし、あなたはそれを手動で呼んで均質にすることができます。 – Snicolas

+0

メソッドを自分で呼び出すことはできません。これは保護されたメソッドです...保護されたクラスが必要です。これはパッケージ 'android.view'で動作しないことに気付きました。 –

+2

これは当てはまりません。コンストラクタで 'super.onFinishInflate'かオーバーライドした' onFinishInflate'を呼び出すことができます。 – GLee

関連する問題