我在我的应用程序中使用片段。大多数片段应该只有一个方向 - 肖像。所以我强制持有人活动始终处于纵向模式。
但是我的一个片段应该同时具有纵向和横向模式。如何仅对一个片段启用方向更改?或者我需要让它成为一个单独的活动来处理方向而不依赖于其他片段?
我在我的应用程序中使用片段。大多数片段应该只有一个方向 - 肖像。所以我强制持有人活动始终处于纵向模式。
但是我的一个片段应该同时具有纵向和横向模式。如何仅对一个片段启用方向更改?或者我需要让它成为一个单独的活动来处理方向而不依赖于其他片段?
您将不得不手动进行。
1) 将此行添加到您的活动标签 android:configChanges="orientation|screenSize"
2)覆盖您的fragmtn或活动中的配置更改回调
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
//Your fragment animation layout changing code
}
我知道这已经过时了,但我会加两分钱,以防它对某人有帮助,因为它仍然是当前的问题。
注意:这个答案是在我发布的一天后编辑的,因为我检测到 API 低于 26 的问题。经过大量测试,以下是我的最终答案。此解决方案在 API 21 及更高版本中有效(经过测试)。
我的案例可能与发布的问题不同,所以我会具体说明我拥有什么,以及我是如何解决的。
在您拥有的每个片段中,您需要覆盖onResume()
. 在其中,您指定要“强制”的方向。
在我的情况下,我只希望一个片段以纵向和横向显示,所以我设置requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
(如果没有设置,这是默认值),但是因为我们将requestedOrientation
在其余片段中更改,所以我们必须设置它这里也是:
override fun onResume() {
super.onResume()
activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
//The rest of your code (if you have something else here).
}
在其余的片段中,我想“强制”竖向,所以我使用了以下内容:
override fun onResume() {
super.onResume()
activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
//The rest of your code (if you have something else here).
}
这就是让它工作所需的一切!以下是可选的,但可能对我有用。
可选1:
如果您有许多片段并且您不想修改/添加onResume()
每个片段,您可以创建一个子类(例如,PortraitFragment)Fragment()
,您只需在其中覆盖onResume()
。然后,您可以从中派生出您希望拥有此功能的所有片段。
open class PortraitFragment : Fragment() {
override fun onResume() {
super.onResume()
activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
}
可选2:
根据您的布局,您可能还需要添加它。
我使用它是因为我的布局没有为多窗口模式做好准备。
在清单中添加android:resizeableActivity="false"
:
<activity android:name=".MainActivity"
android:launchMode="singleTask"
android:windowSoftInputMode="stateHidden|adjustPan"
android:resizeableActivity="false">
我找到了解决这个问题的方法:
在每个片段中覆盖 setUserVisibleHint()。
在肖像中只有片段:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser) {
Activity a = getActivity();
if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
setRequestedOrientation
在选择要显示的片段时使用Activity 方法。
public class MyActivity extends Activity {
// ...
public void chooseFragment(int x) {
Fragment newFragment;
if (x == 1) {
// FragmentOne can be any orientation
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
newFragment = new FragmentOne();
}
else {
// FragmentTwo can be only portrait orientation
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
newFragment = new FragmentTwo();
}
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, newFragment)
.commit();
}
// ...
}
在您的AndroidManifest.xml添加android:screenOrientation="portrait"在您想要修复为Portrait的片段中,并且不要在您不想修复方向的片段中添加此语句。例子:
<activity
android:name="com.example.myapp.MainActivity"
android:screenOrientation="portrait"/>