的onCreate()和onCreateView()调用了很多比需要更多的(片段)片段、更多、onCreate、onCreateView

2023-09-04 08:12:24 作者:想醉倒先生怀里

有人可以解释为什么的onCreate() onCreateView()正在调用了很多次这与增量每个方位的变化?

下面是非常简单的应用程序,它包含一个活动两个片段组成。第二个片段负荷动态。如果您在的main.xml 定义这两个片段就不会有这样的行为。

下面是的main.xml :     

 <片段类=ets.saeref.Left
        机器人:ID =@ + ID / left_frag
        机器人:layout_weight =70
        机器人:layout_width =match_parent
        机器人:layout_height =match_parent/>

     <的FrameLayout机器人:ID =@ + ID / right_frag
        机器人:layout_weight =30
        机器人:layout_width =match_parent
        机器人:layout_height =match_parent/>

< / LinearLayout中>
 
一次 Android 字节码插桩实战

下面是左断枝:

 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:方向=垂直机器人:layout_width =match_parent
    机器人:layout_height =match_parent机器人:后台=#000000>
    <按钮的android:文本=横向机器人:ID =@ + ID /按钮1
        机器人:layout_width =WRAP_CONTENT机器人:layout_height =WRAP_CONTENT>< /按钮>

< / LinearLayout中>
 

下面是对断枝:

 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:方向=垂直机器人:layout_width =match_parent
    机器人:layout_height =match_parent机器人:后台=#FFFFFF>
    <按钮的android:文本=横向机器人:ID =@ + ID /按钮1
        机器人:layout_width =WRAP_CONTENT机器人:layout_height =WRAP_CONTENT>< /按钮>

< / LinearLayout中>
 

Left.class:

 公共类向左延伸片段{

    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        Log.i(左,的onCreate());
    }

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
            捆绑savedInstanceState){
        Log.i(左,onCreateView());
        返回inflater.inflate(R.layout.left,集装箱,假);
    }
}
 

Right.class:

 公共类权延片段{

    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        Log.i(右,的onCreate());
    }

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
            捆绑savedInstanceState){
        Log.i(右,onCreateView());
        返回inflater.inflate(R.layout.right,集装箱,假);
    }
}
 

主要类:

 公共类主要扩展活动{
    / **第一次创建活动时调用。 * /
    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.main);

        片段FG =新右();
        getFragmentManager()的BeginTransaction()。增加(R.id.right_frag,FG)
            。承诺();
        Log.i(主,的onCreate());
    }
}
 

几经方向更改日志:

  08-28 21:47:38.220:信息/主(1099):的onCreate()
08-28 21:47:38.220:INFO /右(1099):onCreateView()
08-28 21:47:38.220:INFO /右(1099):onCreateView()
08-28 21:47:38.220:INFO /右(1099):onCreateView()
08-28 21:47:38.220:INFO /右(1099):的onCreate()
08-28 21:47:38.220:INFO /右(1099):onCreateView()
08-28 21:47:41.110:信息/ ActivityManager(142):配置改变:{1.0 0mcc0mnc EN_US sw800dp w1280dp h752dp xlrg土地手指-keyb / V / H -nav /小时s.162}
08-28 21:47:41.140:INFO /右(1099):的onCreate()
08-28 21:47:41.140:INFO /右(1099):的onCreate()
08-28 21:47:41.140:INFO /右(1099):的onCreate()
08-28 21:47:41.140:INFO /右(1099):的onCreate()
08-28 21:47:41.170:信息/左(1099):的onCreate()
08-28 21:47:41.170:信息/左(1099):onCreateView()
08-28 21:47:41.170:信息/主(1099):的onCreate()
08-28 21:47:41.170:INFO /右(1099):onCreateView()
08-28 21:47:41.170:INFO /右(1099):onCreateView()
08-28 21:47:41.170:INFO /右(1099):onCreateView()
08-28 21:47:41.170:INFO /右(1099):onCreateView()
08-28 21:47:41.190:INFO /右(1099):的onCreate()
08-28 21:47:41.190:INFO /右(1099):onCreateView()
08-28 21:47:45.070:信息/ ActivityManager(142):配置改变:{1.0 0mcc0mnc EN_US sw800dp w800dp h1232dp xlrg端口手指-keyb / V / H -nav /小时s.163}
08-28 21:47:45.120:INFO /右(1099):的onCreate()
08-28 21:47:45.120:INFO /右(1099):的onCreate()
08-28 21:47:45.120:INFO /右(1099):的onCreate()
08-28 21:47:45.120:INFO /右(1099):的onCreate()
08-28 21:47:45.120:INFO /右(1099):的onCreate()
08-28 21:47:45.130:信息/左(1099):的onCreate()
08-28 21:47:45.130:信息/左(1099):onCreateView()
08-28 21:47:45.130:信息/主(1099):的onCreate()
08-28 21:47:45.130:INFO /右(1099):onCreateView()
08-28 21:47:45.130:INFO /右(1099):onCreateView()
08-28 21:47:45.130:INFO /右(1099):onCreateView()
08-28 21:47:45.140:INFO /右(1099):onCreateView()
08-28 21:47:45.140:INFO /右(1099):onCreateView()
08-28 21:47:45.140:INFO /右(1099):的onCreate()
08-28 21:47:45.140:INFO /右(1099):onCreateView()
 

解决方案

我不能指向这也解释了这个文件,但解决的办法是只创建和添加片段活动时首先加载,这样的:

  @覆盖
公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.main);

    如果(savedInstanceState == NULL){
        片段FG =新右();
        getFragmentManager()的BeginTransaction()。增加(R.id.right_frag,FG)
            。承诺();
    }
    Log.i(主,的onCreate());
}
 

Can somebody explain why the onCreate() and onCreateView() are being invoked so many times which increments with each orientation change?

Here is very simple app which consists of one Activity composed of two Fragments. The second Fragment loads dynamically. If you define these two Fragments in main.xml there would not be such a behavior.

Here is main.xml:

       <fragment class="ets.saeref.Left"
        android:id="@+id/left_frag"
        android:layout_weight="70"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

     <FrameLayout android:id="@+id/right_frag" 
        android:layout_weight="30"
        android:layout_width="match_parent" 
        android:layout_height="match_parent"/>

</LinearLayout>

Here is left frag:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent" android:background="#000000">
    <Button android:text="Landscape" android:id="@+id/button1"
        android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

</LinearLayout>

Here is right frag:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent" android:background="#ffffff">
    <Button android:text="Landscape" android:id="@+id/button1"
        android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

</LinearLayout>

Left.class:

public class Left extends Fragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i("Left", "onCreate()");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        Log.i("Left", "onCreateView()");
        return inflater.inflate(R.layout.left, container, false);
    }
}

Right.class:

public class Right extends Fragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i("Right", "onCreate()");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        Log.i("Right", "onCreateView()");
        return inflater.inflate(R.layout.right, container, false);
    }
}

Main class:

public class Main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Fragment fg = new Right();
        getFragmentManager().beginTransaction().add(R.id.right_frag, fg)
            .commit();
        Log.i("Main", "onCreate()");
    }
}

Log after several orientation changes:

08-28 21:47:38.220: INFO/Main(1099): onCreate()
08-28 21:47:38.220: INFO/Right(1099): onCreateView()
08-28 21:47:38.220: INFO/Right(1099): onCreateView()
08-28 21:47:38.220: INFO/Right(1099): onCreateView()
08-28 21:47:38.220: INFO/Right(1099): onCreate()
08-28 21:47:38.220: INFO/Right(1099): onCreateView()
08-28 21:47:41.110: INFO/ActivityManager(142): Config changed: {1.0 0mcc0mnc en_US sw800dp w1280dp h752dp xlrg land finger -keyb/v/h -nav/h s.162}
08-28 21:47:41.140: INFO/Right(1099): onCreate()
08-28 21:47:41.140: INFO/Right(1099): onCreate()
08-28 21:47:41.140: INFO/Right(1099): onCreate()
08-28 21:47:41.140: INFO/Right(1099): onCreate()
08-28 21:47:41.170: INFO/Left(1099): onCreate()
08-28 21:47:41.170: INFO/Left(1099): onCreateView()
08-28 21:47:41.170: INFO/Main(1099): onCreate()
08-28 21:47:41.170: INFO/Right(1099): onCreateView()
08-28 21:47:41.170: INFO/Right(1099): onCreateView()
08-28 21:47:41.170: INFO/Right(1099): onCreateView()
08-28 21:47:41.170: INFO/Right(1099): onCreateView()
08-28 21:47:41.190: INFO/Right(1099): onCreate()
08-28 21:47:41.190: INFO/Right(1099): onCreateView()
08-28 21:47:45.070: INFO/ActivityManager(142): Config changed: {1.0 0mcc0mnc en_US sw800dp w800dp h1232dp xlrg port finger -keyb/v/h -nav/h s.163}
08-28 21:47:45.120: INFO/Right(1099): onCreate()
08-28 21:47:45.120: INFO/Right(1099): onCreate()
08-28 21:47:45.120: INFO/Right(1099): onCreate()
08-28 21:47:45.120: INFO/Right(1099): onCreate()
08-28 21:47:45.120: INFO/Right(1099): onCreate()
08-28 21:47:45.130: INFO/Left(1099): onCreate()
08-28 21:47:45.130: INFO/Left(1099): onCreateView()
08-28 21:47:45.130: INFO/Main(1099): onCreate()
08-28 21:47:45.130: INFO/Right(1099): onCreateView()
08-28 21:47:45.130: INFO/Right(1099): onCreateView()
08-28 21:47:45.130: INFO/Right(1099): onCreateView()
08-28 21:47:45.140: INFO/Right(1099): onCreateView()
08-28 21:47:45.140: INFO/Right(1099): onCreateView()
08-28 21:47:45.140: INFO/Right(1099): onCreate()
08-28 21:47:45.140: INFO/Right(1099): onCreateView()

解决方案

I can't point to the documentation which explains this, but the solution is to only create and add the fragment when the activity first loads, like this:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    if (savedInstanceState == null) {
        Fragment fg = new Right();
        getFragmentManager().beginTransaction().add(R.id.right_frag, fg)
            .commit();
    }
    Log.i("Main", "onCreate()");
}

 
精彩推荐
图片推荐