为单一活动架构中的片段设置横向方向

时间:2018-08-06 14:47:07

标签: android android-fragments android-activity android-orientation

如何在单一活动体系结构中仅实现一个Fragment 锁定屏幕方向(整个应用程序只有一个Activity)?

是否有比在每个Fragment中指定请求方向更好的解决方案? 我试图避免将activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED放到每个不相关的Fragment

8 个答案:

答案 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();

我仍然认为这是最好的方法。