web-dev-qa-db-fra.com

la méthode onCreateView est appelée quand? et combien de fois dans le cycle de vie d'une activité?

J'ai écrit un petit programme ressemblant à ceci:

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");
    }
}

Quelle est l'activité principale.

Le LogCat c'est:

06-11 07: 07: 10.033: D/com.example.lifecycle.LifeLogger (600): Événement onCreateView 06-11 07: 07: 10.033: D/com.example.lifecycle.LifeLogger (600): événement onCreateView 06-11 07: 07: 10.043: D/com.example.lifecycle.LifeLogger (600): onCreateView événement 06-11 07: 07: 10.053: D/com.example.lifecycle.LifeLogger (600): Événement onCreateView 06-11 07: 07: 10.063: D/com.example.lifecycle.LifeLogger (600): événement onCreateView 06-11 07: 07: 10.063: D/com.example.lifecycle.LifeLogger (600): onCreateView événement 06-11 07: 07: 10.063: D/com.example.lifecycle.LifeLogger (600): Événement onCreateView 06-11 07: 07: 10.063: D/com.example.lifecycle.LifeLogger (600): événement onCreateView 06-11 07: 07: 10.073: D/com.example.lifecycle.LifeLogger (600): onCreateView événement 06-11 07: 07: 10.073: D/com.example.lifecycle.LifeLogger (600): Événement onCreateView 06-11 07: 07: 10.083: D/com.example.lifecycle.LifeLogger (600): événement onCreateView 06-11 07: 07: 10.083: D/com.example.lifecycle.LifeLogger (600): onCreateView événement 06-11 07: 07: 10.083: D/com.example.lifecycle.LifeLogger (600): Événement onCreateView 06-11 07: 07: 10.093: D/com.example.lifecycle.LifeLogger (600): événement onCreateView 06-11 07: 07: 10.093: D/com.example.lifecycle.LifeLogger (600): onCreateView événement 06-11 07: 07: 10.093: D/com.example.lifecycle.LifeLogger (600): Événement onCreateView 06-11 07: 07: 10.103: D/com.example.lifecycle.LifeLogger (600): événement onCreateView 06-11 07: 07: 10.113: D/com.example.lifecycle.LifeLogger (600): onCreateView événement 06-11 07: 07: 10.113: D/com.example.lifecycle.LifeLogger (600): Événement onCreateView 06-11 07: 07: 10.113: D/com.example.lifecycle.LifeLogger (600): événement OnCreate 06-11 07: 07: 10.113: D/com.example.lifecycle.LifeLogger (600): événement onStart 06-11 07: 07: 10.113: D/com.example.lifecycle.LifeLogger (600): onResume événement 06-11 07: 07: 10.193: D/com.example.lifecycle.LifeLogger (600): Événement onCreateView 06-11 07: 07: 10.223: D/gralloc_goldfish (600): Émulateur sans émulation de GPU détecté. 06-11 07: 08: 19.633: D/com.example.lifecycle.LifeLogger (600): événement onPause 06-11 07: 08: 20.213: D/com.example.lifecycle.LifeLogger (600): événement onStop 06-11 07: 08: 31.993: D/com.example.lifecycle.LifeLogger (600): onRestart événement 06-11 07: 08: 31.993: D/com.example.lifecycle.LifeLogger (600): Événement onStart 06-11 07: 08: 31.993: D/com.example.lifecycle.LifeLogger (600): événement onResume 06-11 07: 08: 51.073: D/com.example.lifecycle.LifeLogger (600): événement onPause 06-11 07: 08: 52.963: D/com.example.lifecycle.LifeLogger (600): onStop événement 06-11 07: 08: 54.043: D/com.example.lifecycle.LifeLogger (600): événement onDestroy

Que s'est-il passé ici? pourquoi onCreateView s'appelle-t-il tant de fois?

Quel est le timing de onCreateView?

Merci.

mettre à jour:

le xml gonflé:

<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>

le manifast:

<?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>

courir sur Android api niveau 16

24
user3728910

Vous avez étendu votre classe avec Activity. Cela signifie que le cycle de vie de votre classe serait comme ci-dessous.

enter image description here

Ainsi, onCreateView n'est pas une méthode de cycle de vie pour une activité. C'est juste une méthode membre qui sera utilisée pour des tâches spécifiques, comme indiqué dans la doc.

Mise en œuvre standard de Android.view.LayoutInflater.Factory.onCreateView utilisé lors du gonflage avec LayoutInflater renvoyé par getSystemService. Ce la mise en œuvre ne fait rien et est pour versions antérieures à Android.os.Build.VERSION_CODES.HONEYCOMB. Les nouvelles applications devraient utilisez onCreateView (View, String, Context, AttributeSet).

Compter sur l'appel de onCreateView () dans une activité est une mauvaise programmation.

Si vous utilisiez Fragment étendu à votre classe et avez écrit la méthode onCreateView (), elle n'aurait été appelée que deux fois après votre onAttach () et votre onDestroyView () si vous êtes toujours sur le même fragment.

Voir ce diagramme.

enter image description here

Ici, c'est une méthode de cycle de vie pour Fragment.

Donc, vous testez avec de fausses hypothèses. C'est tout!

46
MKJParekh

Android Framework utilise le mécanisme d'injection de dépendances lorsque le fichier de présentation est gonflé.Je pense qu'en raison de cela onCreateView est appelé plusieurs fois.La formule pour cela pourrait être comme ci-dessous

  • Pas de vue dans la mise en page XML == Pas d'appels à onCreateView

Essayez de supprimer setContentView et voyez combien de fois onCreateView est appelé. Vous pourriez en obtenir un aperçu.

3

Vous pouvez surveiller la raison pour laquelle onCreateView est appelé à partir d'un fichier journal: 

ajoutez dans votre méthode onCreateView ceci: 

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

tel que mon logcat produit ceci; 

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
Emre Kilinc Arslan

onCreateView appels = nombre de vues dans la mise en page (créer chaque vue)

0