Android 如果方向改变则片段不显示

Android fragment not shown if orientation change

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

现在一切正常,除了一种情况: 如果 phone 处于横向模式,并且我想显示配置为纵向的片段,则屏幕变为空白并且在我更改方向之前不会出现任何内容。

即使 phone 在 "landscape position" 中,也有一种方法可以显示我的 activity 的肖像。

我是这样设置fragment只在显示时竖屏显示的,切换到其他fragment时恢复原来的配置

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

P.s。所有片段都在同一个activity.

只需添加

android:screenOrientation="portrait"

在清单文件的 activity 标签中固定任何 activity 的方向。

我有一些类似的问题,在我的 activity 中,我尝试了这样的事情:

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

使用 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();
        }
    }

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

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

然后切换回

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

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

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

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

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

所以我所做的是:

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

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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