web-dev-qa-db-ja.com

onCreateViewメソッドはいつ呼び出されますか?アクティビティライフサイクルでは何回ですか?

次のような小さなプログラムを作成しました。

package com.example.lifecycle;

import Android.app.Activity;
import Android.content.Context;
import Android.os.Bundle;
import Android.util.AttributeSet;
import Android.util.Log;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.view.View;

public class LifeLogger extends Activity {

    private String TAG = this.getClass().getName().toString();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_life_logger);
        Log.d(TAG,"onCreate event");
    }
    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"onResume event");
    }
    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG,"onPause event");
    }
    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG,"onStop event");
    }
    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG,"onRestart event");
    }
    @Override
    public View onCreateView(String name, Context context, AttributeSet attrs) {
        Log.d(TAG,"onCreateView event");
        return super.onCreateView(name, context, attrs);
    }
    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG,"onStart event");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"onDestroy event");
    }
}

これが主な活動です。

LogCatは次のとおりです。

06-11 07:07:10.033:D/com.example.lifecycle.LifeLogger(600):onCreateViewイベント06-11 07:07:10.033:D/com.example.lifecycle.LifeLogger(600):onCreateViewイベント06- 11 07:07:10.043:D/com.example.lifecycle.LifeLogger(600):onCreateViewイベント06-11 07:07:10.053:D/com.example.lifecycle.LifeLogger(600):onCreateViewイベント06-11 07 :07:10.063:D/com.example.lifecycle.LifeLogger(600):onCreateViewイベント06-11 07:07:10.063:D/com.example.lifecycle.LifeLogger(600):onCreateViewイベント06-11 07:07 :10.063:D/com.example.lifecycle.LifeLogger(600):onCreateViewイベント06-11 07:07:10.063:D/com.example.lifecycle.LifeLogger(600):onCreateViewイベント06-11 07:07:10.073 :D/com.example.lifecycle.LifeLogger(600):onCreateViewイベント06-11 07:07:10.073:D/com.example.lifecycle.LifeLogger(600):onCreateViewイベント06-11 07:07:10.083:D /com.example.lifecycle.LifeLogger(600):onCreateViewイベント06-11 07:07:10.083:D/com.example.lifecycle.LifeLogger(600):onCreateViewイベント06-11 07:07:10.083:D/com .example.lifecy cle.LifeLogger(600):onCreateViewイベント06-11 07:07:10.093:D/com.example.lifecycle.LifeLogger(600):onCreateViewイベント06-11 07:07:10.093:D/com.example.lifecycle。 LifeLogger(600):onCreateViewイベント06-11 07:07:10.093:D/com.example.lifecycle.LifeLogger(600):onCreateViewイベント06-11 07:07:10.103:D/com.example.lifecycle.LifeLogger( 600):onCreateViewイベント06-11 07:07:10.113:D/com.example.lifecycle.LifeLogger(600):onCreateViewイベント06-11 07:07:10.113:D/com.example.lifecycle.LifeLogger(600) :onCreateViewイベント06-11 07:07:10.113:D/com.example.lifecycle.LifeLogger(600):onCreateイベント06-11 07:07:10.113:D/com.example.lifecycle.LifeLogger(600):onStartイベント06-11 07:07:10.113:D/com.example.lifecycle.LifeLogger(600):onResumeイベント06-11 07:07:10.193:D/com.example.lifecycle.LifeLogger(600):onCreateViewイベント06 -11 07:07:10.223:D/gralloc_goldfish(600):GPUエミュレーションなしのエミュレーターが検出されました。 06-11 07:08:19.633:D/com.example.lifecycle.LifeLogger(600):onPauseイベント06-11 07:08:20.213:D/com.example.lifecycle.LifeLogger(600):onStopイベント06- 11 07:08:31.993:D/com.example.lifecycle.LifeLogger(600):onRestartイベント06-11 07:08:31.993:D/com.example.lifecycle.LifeLogger(600):onStartイベント06-11 07 :08:31.993:D/com.example.lifecycle.LifeLogger(600):onResumeイベント06-11 07:08:51.073:D/com.example.lifecycle.LifeLogger(600):onPauseイベント06-11 07:08 :52.963:D/com.example.lifecycle.LifeLogger(600):onStopイベント06-11 07:08:54.043:D/com.example.lifecycle.LifeLogger(600):onDestroyイベント

ここで何が起こったのですか? onCreateViewが何度も呼び出されるのはなぜですか?

OnCreateViewのタイミングは何ですか?

ありがとう。

更新:

膨らんだxml:

<RelativeLayout 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"
    tools:context="${packageName}.${activityClass}" >

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="@string/hello_world" />

</RelativeLayout>

マニファスト:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.lifecycle"
    Android:versionCode="1"
    Android:versionName="1.0" >

    <uses-sdk
        Android:minSdkVersion="15"
        Android:targetSdkVersion="17" />

    <application
        Android:allowBackup="true"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >
        <activity
            Android:name="com.example.lifecycle.LifeLogger"
            Android:label="@string/app_name" >
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

実行Android APIレベル16

26
user3728910

Activityでクラスを拡張しました。つまり、クラスのライフサイクルは次のようになります。

enter image description here

したがって、onCreateViewはアクティビティのライフサイクルメソッドではありません。これは、ドキュメントで述べられているように、指定されたタスクに使用される単なるメンバーメソッドです。

GetSystemServiceによって返されたLayoutInflaterでインフレートするときに使用されるAndroid.view.LayoutInflater.Factory.onCreateViewの標準実装。この実装は何も行わず、Android.os.Build.VERSION_CODES.HONEYCOMB以前のアプリ用です。新しいアプリはonCreateView(View、String、Context、AttributeSet)を使用する必要があります。

ActivityでonCreateView()の呼び出しに依存するのは、プログラミングが悪いです。

クラスに拡張されたFragmentを使用し、onCreateView()メソッドを記述した場合、同じフラグメントを使用している場合は、onAttach()およびonDestroyView()の後に2回だけ呼び出されます。

この図をご覧ください。

enter image description here

ここで、それはフラグメントのライフサイクルの方法です。

したがって、間違った前提でテストしています。それで全部です!

48
MKJParekh

Androidフレームワークは、依存関係の挿入のメカニズムを使用します。レイアウトファイルが膨張している場合。このため、onCreateViewは何度も呼び出されます。

  • レイアウトxmlのビューの数== onCreateViewの呼び出しの数

SetContentViewを削除して、onCreateViewが何回呼び出されるかを確認してみてください。

3

OnCreateViewがログファイルから呼び出される理由を監視できます。

これをonCreateViewメソッド内に追加します。

Log.d("TAG", "onCreateView event : " + name);

私のlogcatなどはこれを生成します。

onCreateView : LinearLayout
onCreateView : ViewStub
onCreateView : FrameLayout
onCreateView : Android.support.v7.widget.ActionBarOverlayLayout
onCreateView : Android.support.v7.widget.ContentFrameLayout
onCreateView : Android.support.v7.widget.ActionBarContainer
onCreateView : Android.support.v7.widget.Toolbar
onCreateView : Android.support.v7.widget.ActionBarContextView
onCreateView : LinearLayout
0

onCreateView呼び出し=レイアウト内のビューの数(各ビューを作成)

0