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

时间:2016-09-20 08:20:10

标签: android android-fragments orientation

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

现在情况很好,除了一个案例: 如果手机处于横向模式,并且我想要显示配置为纵向的片段,则屏幕变为空白,在我更改方向之前不会显示任何内容。

即使手机处于“风景位置”,也可以用纵向显示我的活动。

这是我在显示时将片段设置为纵向的方式,并在更改为其他片段时恢复为原始配置。

@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。所有碎片都处于相同的活动中。

5 个答案:

答案 0 :(得分: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"

答案 1 :(得分:1)

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

答案 2 :(得分:1)

在要强制“活动”处于纵向模式的片段中,您可以使用:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

然后切换回

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

或用其他片段替换它时所需的任何方向状态。

答案 3 :(得分:1)

谢谢你的所有答案,无论如何我找到了另一个解决方案,只需改变一行。

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

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

所以我做的是:

在调用Portrait Fragment模式之前的MainMenu片段中的

我改变了方向:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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

答案 4 :(得分:0)

只需添加

  

机器人:screenOrientation =&#34;肖像&#34;

在清单文件的活动代码中,以修复任何活动的方向。