【问题标题】:Android : Fragment onCreateView method call again after orientation changedAndroid:方向改变后再次调用片段onCreateView方法
【发布时间】:2014-11-27 20:35:09
【问题描述】:

我实现了具有横向和纵向模式两种布局的应用程序。横向布局位于 layout-land 中。我有用于纵向布局的fragment1 和用于横向布局的fragment2。我覆盖了每个片段中的onCreateView

我有静态变量来知道当前的片段。我在onCreateView(片段1 为1,片段2 为2)分配。

我的问题是当方向为横向模式时静态值仍然是1。

我调试了应用程序的方向。当我将方向纵向更改为横向时,首先调用 fragment2 的 onCreateView 方法,然后再次调用 fragment1 的 onCreateView 方法。静态值已被覆盖。

我不知道为什么fragment1onCreateView方法在fragment2调用之后调用?我想为正确的片段分配正确的值。

对不起,我的英语不好。

谢谢。

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    您不需要保存任何东西! 只需让您的活动处理方向更改即可。 在 AndroidManifest.xml 中放这个

        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|screenSize" >
        </activity>
    

    【讨论】:

      【解决方案2】:

      您需要保存捆绑包并且必须覆盖 onsavedinstance 方法,以便不会再次创建活动。

      首先,当方向改变时,android会检查savedinstancestate,如果实现了就调用onSavedInstanceState方法。

      【讨论】:

        【解决方案3】:

        在你必须调用的每个片段的 onCreate 中

        getActivity().setRequestedOrientation(requestedOrientation)
        

        【讨论】:

          【解决方案4】:

          如果您的 Fragments 在横向和纵向中具有不同的“业务逻辑”,您应该有两个特殊的 Fragment 实现。如果它们只是具有不同的布局,则使用 1 个 Fragment 实现,并创建 2 个布局,每个方向一个。

          Activity.onCreate() 中实例化并创建您的Fragments。但不要将当前的Fragment 保存在静态变量中。而是询问FragmentManager 是否已经添加了Fragment

          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
          
              Fragment myFragment = getSupportFragmentManager().findFragmentByTag("myTag");
              if(myFragment == null){
                  //no Fragment has been added
                  FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                  transaction.add(new MyFragment1(), "myTag");
                  transaction.commit();
              }else{
                  //the fragment has been added already, possibley before orientation change
                  //you could check its type and replace it
                  if(fragment instanceof MyFragment1){
          
                  }else if(fragment instanceof MyFragment2{
          
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2018-12-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-28
            • 1970-01-01
            • 1970-01-01
            • 2023-03-10
            • 1970-01-01
            相关资源
            最近更新 更多