使用平板电脑的两个片段占位符在应用上处理屏幕旋转,One For Mobile

时间:2017-03-07 18:55:03

标签: android android-fragments

我正在尝试开发一款适用于手机和平板电脑的应用程序。我最初的想法是,我需要创建三个活动xml文件(一个用于移动设备,另一个用于平板电脑[纵向],另一个用于平板电脑[在横向])。移动设备的一个有一个FrameLayout,我以编程方式加载登录片段。平板电脑的布局文件(肖像画面),也有一个FrameLayout。平板电脑的最后一个布局文件(横向)有两个FrameLayout,我以编程方式加载两个片段。在加载片段之前,我认为您需要先进行一些计算 - 查看当前设备是手机还是平板电脑,然后检查平板电脑是纵向还是横向。然后,在完成这些计算之后,加载必要的片段。所有这些我已经完成了,我现在停止处理屏幕旋转。

如何确保移动应用加载当前加载的片段?按照目前的情况,如果我进一步浏览应用程序(进入注册),它将加载此片段,但是,当平板电脑或手机旋转时,它会将我带回到第一个加载的片段 - 这是登录片段。

我想也许我需要使用Activity的onPause和onResume方法来保存和重新加载当前打开的片段 - 这对于移动设备来说还不错,但我想平板电脑会很棘手。

所以我的问题是,你如何处理为移动设备和平板电脑制作的应用程序的屏幕旋转 - 布局计划是不同的。

以下是我的MainActivity中的代码:

   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getData();
    setSocialMedia();
    mainActivityToolbar = (Toolbar) findViewById(R.id.MainActivityToolbar);
    toolbarTextView = (TextView) findViewById(R.id.MainActivityToolbarTextView);
    setSupportActionBar(mainActivityToolbar);
    loadLoginFragment();

}

以下是我创建的代码,用于检查设备是手机还是平板电脑,然后检查方向,然后加载所需的片段:

 private void loadLoginFragment(){
    deviceUtils = new DeviceUtils(this);
    isTablet = deviceUtils.isTablet();
    if (isTablet) {
        toolbarTextView.setText("Log In To Continue");
        isLandscape = deviceUtils.isLandscape();
        if (isLandscape) {
            LoginFragment loginFragment = new LoginFragment();
            LoginInformationFragment loginInformationFragment = new LoginInformationFragment();
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction loginTransaction = fragmentManager.beginTransaction();
            loginTransaction.replace(R.id.MainActivityContentViewTabletOne, loginFragment);
            loginTransaction.addToBackStack(null);
            loginTransaction.commit();

            FragmentTransaction informationTransaction = fragmentManager.beginTransaction();
            informationTransaction.replace(R.id.MainActivityContentViewTabletTwo, loginInformationFragment);
            informationTransaction.addToBackStack(null);
            informationTransaction.commit();
        } else {
            LoginFragment loginFragment = new LoginFragment();
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.MainActivityContentViewTabletLand, loginFragment);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }
    } else {
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.MainActivityContentViewMobile, new LoginFragment());
        transaction.addToBackStack(null);
        transaction.commit();
    }
}

任何帮助或提示都会很棒:)谢谢。

2 个答案:

答案 0 :(得分:0)

Android在处理不同类型的设备方面提供了大量支持,并为您完成了大量工作。如果您还没有,我建议您查看Supporting Different Screen Sizes以及Android培训中的相关资料。另请查看Handling Configuration Changesdocumentation for fragments也有一些关于嵌入式片段的好信息。

另一个很好的例子是Implementing Adaptative UI Flows,它有一个关于检测和响应当前布局的部分。

我还发现亚历克斯洛克伍德的this write-up非常宝贵。

答案 1 :(得分:0)

  

如何处理针对移动设备和平板电脑制作的应用的屏幕旋转 - 布局规划不同。

如果我正确理解您的情况,您的应用只会在移动设备上显示片段时以纵向显示片段,而平板电脑中可能会显示单个窗格(纵向)或双窗格(横向)取决于方向。如果是这种情况,那么您可以使用最小屏幕宽度方向配置限定符来实现此目的。

您需要创建两个activity_main.xml,其中一个带有FrameLayout,另一个带有两个FrameLayout,并分别存储在主> res>布局和主> res> layout-sw820dp-land中:

main> res>布局中的activity_main.xml示例:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/MainActivityContentViewOne"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

main&gt; res&gt; layout-sw820dp-land中的activity_main.xml示例:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <FrameLayout
        android:id="@+id/MainActivityContentViewOne"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3"/>

    <FrameLayout
        android:id="@+id/MainActivityContentViewTwo"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3"/>

</LinearLayout>

在MainActivity中,通过检查具有MainActivityContentViewTwo id的第二个FrameLayout是否存在来加载片段(在任何情况下,第一个带有MainActivityContentViewOne id的FrameLayout始终存在):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // any of your code ...

    // load the fragment
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.MainActivityContentViewOne, new LoginFragment());
    if (findViewById(R.id.MainActivityContentViewTwo) != null)
        // app is running in tablet and landscape configuration
        fragmentTransaction.replace(R.id.MainActivityContentViewTwo, new LoginInformationFragment());
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}