【问题标题】:Android fragment not shown if orientation change如果方向改变,Android片段不显示
【发布时间】:2016-09-21 05:51:34
【问题描述】:

在我的应用程序中,我有许多可以以纵向和横向模式显示的片段,除了一个片段,我需要以纵向模式显示。

现在一切都很好,除了一种情况: 如果手机处于横向模式,并且我想显示配置为纵向的片段,则屏幕变为空白并且在我更改方向之前什么都不会出现。

即使手机处于“横向位置”,也有一种方法可以纵向显示我的活动。

这就是我如何将片段设置为仅在显示时为纵向,并在更改为其他片段时恢复为原始配置。

@Override
public void onResume() {
    super.onResume();
    Log.i(TAG, "resume");
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    getActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}

@Override
public void onPause() {
    super.onPause();
    Log.i(TAG, "onpause");
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
    getActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}

附:所有片段都在同一个活动中。

【问题讨论】:

    标签: android android-fragments orientation


    【解决方案1】:

    我遇到了一些类似的问题,在我的活动中我尝试了这样的事情:

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Fragment currentFragment =
            getSupportFragmentManager().findFragmentById(R.id.fragment_container);
        getSupportFragmentManager().beginTransaction()
            .detach(currentFragment).attach(currentFragment).commit();
    }
    

    并将其添加到AndroidManifest.xml 文件<activity>

    android:configChanges="orientation|screenSize"
    

    【讨论】:

      【解决方案2】:

      使用 onSaveInstanceState 来存储和检索您的片段标签名称。并根据片段标签名称加载片段

       @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              if (savedInstanceState != null) {
                  currentView = savedInstanceState.getString(TAB_STATE, null);
              }
      
              if (currentView != null) {
                  if ("Your_Fragment_Tag_name".equals(currentView)) {
                      switchFragment(feedFragment, "Your_Fragment_Tag_name");
                  }
              } else {
                  switchFragment(feedFragment, "Your_Fragment_Tag_name");
              }
            }
      
      
              @Override
          protected void onSaveInstanceState(Bundle outState) {
              outState.putString(TAB_STATE, currentView);
              super.onSaveInstanceState(outState);
          }
      
      
          /**
           * to switchFragment
           *
           * @param fragment Fragment
           * @param view     String
           */
          private void switchFragment(Fragment fragment, String view) {
              int backStackCount = fragmentManager.getBackStackEntryCount();
              for (int i = 0; i < backStackCount; i++) {
                  fragmentManager.popBackStack();
              }
      
              actionBar.setHomeButtonEnabled(false);
              actionBar.setDisplayHomeAsUpEnabled(false);
              invalidateOptionsMenu();
      
              FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
              Fragment currentFragment = fragmentManager.findFragmentByTag(view);
              if (currentFragment != null) {
                  fragmentTransaction.show(currentFragment);
              } else {
                  currentView = view;
                  fragmentTransaction.replace(R.id.fragmentContainer, fragment, view);
                  fragmentTransaction.commit();
              }
          }
      

      【讨论】:

        【解决方案3】:

        在你想要强制 Activity 处于纵向模式的 Fragment 中,你可以使用:

        getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        然后切换回

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

        或者用另一个片段替换它时你想要的任何方向状态。

        【讨论】:

          【解决方案4】:

          感谢您的所有回答,无论如何我找到了另一种解决方案,只需更改一行。

          显然,只有当我尝试从我想要纵向的片段内部更改方向时才会出现问题(屏幕变为空白)

          但是如果我从调用者片段中更改设置方向,它会正确更改。

          所以我做的是:

          在调用纵向片段模式之前的 MainMenu 片段中,我更改了方向:

          getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
          

          (显然在另一个片段中,当 onPause 被调用时,我恢复为 ActivityInfo.SCREEN_ORIENTATION_SENSOR)。

          【讨论】:

            【解决方案5】:

            简单添加

            android:screenOrientation="portrait"

            在清单文件的活动标签中,以固定任何活动的方向。

            【讨论】:

            • 但这不是我想要的!我希望所有其他片段都可以改变方向,除了必须固定在纵向的片段!
            • 一个片段与所有其他片段处于相同的活动中
            • @PreetikaKaur lvan 只想让一个片段不改变其方向,这可能与该属性有关吗?
            • 他没有提到他想要的一个片段是在同一个活动还是不同的活动中
            • 在同一个活动中
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-02-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多