如何在单一活动体系结构中仅实现一个Fragment
锁定屏幕方向(整个应用程序只有一个Activity
)?
是否有比在每个Fragment
中指定请求方向更好的解决方案?
我试图避免将activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
放到每个不相关的Fragment
答案 0 :(得分:3)
在Landscape
模式下将要分段的行下方添加:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
//ADD BELOW LINE
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
view = inflater.inflate(R.layout.fragment_dashboard, container, false);
return view;
}
如果您在片段中添加以上代码,则所有片段均以Landscape
模式显示。但是您想要一个片段。因此在 Other Fragment中添加以下代码
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
//ADD BELOW LINE
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
view = inflater.inflate(R.layout.fragment_inventory, container, false);
return view;
}
注意:无需在manifest.xml
中添加方向
答案 1 :(得分:2)
我将扩展Fragment
并为我所有的片段创建一个BaseFragment
。在这个基本片段上,我将使用activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR
public abstract class BaseFragment extends Fragment {
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser) {
Activity a = getActivity();
if(a != null)
a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
}
}
对于特定的锁定片段,我只使用activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
。
public class LandscapeFragment extends BaseFragment {
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser) {
Activity a = getActivity();
if(a != null)
a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
}
您现在唯一的更改是使所有片段扩展BaseFragment
而不是Fragment
,但这在其他共享功能中也可能是有益的。
我不熟悉Kotlin,但Kotlin代码可能像这样:
abstract class BaseFragment : Fragment() {
override fun setUserVisibleHint(isVisibleToUser : Boolean){
super.setUserVisibleHint(isVisibleToUser)
if(isVisibleToUser) {
getActivity()?.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR)
}
}
}
class LandscapeFragment : BaseFragment() {
override fun setUserVisibleHint(isVisibleToUser : Boolean) {
super.setUserVisibleHint(isVisibleToUser)
if(isVisibleToUser) {
getActivity()?.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
}
}
}
答案 2 :(得分:1)
<activity
android:name=".user_interface.activities.MainActivity"
android:screenOrientation="landscape"
android:theme="@style/MyMaterialTheme"/>
答案 3 :(得分:1)
首先让我说 @madlymad 是个正确的主意,如果还没有,应该创建一个BaseFragment
类。
但是,如果由于某些原因而您不想或不想,可以改为在Fragment
的{{1}},onAttached()
或{{1}中设置方向}
onCreate()
,然后在各自的对应onCreateView()
,activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
或onDetached()
onDestroy()
这将确保您仅在正确的片段中获得不同的方向。
答案 4 :(得分:1)
在您的片段片段中添加:
@Override
public void onResume() {
super.onResume();
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
@Override
public void onPause() {
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
super.onPause();
}
onPause方法代码可确保您的活动恢复为纵向
答案 5 :(得分:0)
如果是活动,则只能在清单文件中为活动标签指定。
如果活动中出现碎片,我想你可以在代码下面
getActivity().setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
在活动中,即通过传递布尔值(如果为真,表示PORTRAIT,否则为LANDSCAPE)来编写方法,然后从片段中调用它。我的意思是,活动是否包含需要不同方向的不同片段。
答案 6 :(得分:0)
Orientation属性是针对每个活动的,因此您只能为包含片段的活动声明方向,以使其处于横向,其余活动将保持原样。
在片段中使用以下代码行,以获取特定的方向(在本例中为纵向)。
getActivity().setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
如果要根据用户握住设备的方式在片段中确定方向,请使用以下代码行。
getActivity().setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
答案 7 :(得分:0)
我有和您相同的场景,我从“活动”中调用所有片段。我可以将代码放在一个地方。
int id = item.getFragmentId();
if (id == R.id.nav_camera) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
// Here you can have your fragment calls
getSupportFragmentManager().beginTransaction().replace(
R.id.content_main,
new YourFragmentForId(),
NotificationFragment.class.getSimpleName())
.commit();
我仍然认为这是最好的方法。