在我的应用程序中,我有很多片段可以在纵向和横向模式下显示,除了一个,我需要以纵向模式显示。
现在情况很好,除了一个案例: 如果手机处于横向模式,并且我想要显示配置为纵向的片段,则屏幕变为空白,在我更改方向之前不会显示任何内容。
即使手机处于“风景位置”,也可以用纵向显示我的活动。
这是我在显示时将片段设置为纵向的方式,并在更改为其他片段时恢复为原始配置。
@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。所有碎片都处于相同的活动中。
答案 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;
在清单文件的活动代码中,以修复任何活动的方向。