我正在尝试开发一款适用于手机和平板电脑的应用程序。我最初的想法是,我需要创建三个活动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();
}
}
任何帮助或提示都会很棒:)谢谢。
答案 0 :(得分:0)
Android在处理不同类型的设备方面提供了大量支持,并为您完成了大量工作。如果您还没有,我建议您查看Supporting Different Screen Sizes以及Android培训中的相关资料。另请查看Handling Configuration Changes。 documentation 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();
}