如何在Android活动中处理2种不同的布局

时间:2014-06-10 11:41:00

标签: android android-layout

[被修改]: 我已经开发了一个适用于不同屏幕大小的手机和平板电脑的应用程序,我按照Android指南来创建不同的UI布局集,以满足不同大小的屏幕(手机和平板电脑),所有布局都将在纵向模式。在此之前一切正常但现在我有一个新的要求,其中平板电脑的布局将被更改,即它将有一些额外的信息而不是电话布局,所有新的布局将采用横向模式。

现在我怀疑是:

  1. 在旧的实现中,所有布局名称在不同的布局文件夹中是相同的,即布局,布局小,布局大等等......因此,根据新要求,所有大型和超大型布局都应采用横向模式但如果我保持相同的布局名称,那么我该如何处理方向?目前,每个活动的清单文件中都提到了orientation属性。
  2. 如果我保留这些布局的不同名称,那么我必须在运行时处理,即在加载活动时,基于检查电话屏幕大小然后加载相应的布局,因此相同的活动可以基于检查加载不同的布局屏幕尺寸。这样做会是最佳方法吗?
  3. 或者,我是否必须为所有新布局引入新活动来处理这种情况?
  4. 请建议我处理这种情况的最佳方法。

3 个答案:

答案 0 :(得分:3)

开始这一点的好处是官方Android文档(链接下方)。

  1. http://developer.android.com/guide/practices/screens_support.html
  2. http://developer.android.com/training/basics/supporting-devices/screens.html
  3. 简而言之,我可以告诉您必须创建多个布局以满足您支持多种屏幕尺寸/分辨率的要求。在您的应用程序源目录中,您必须在不同的resource-layout-directories下创建不同的布局xml(具有相同的名称),如下所示:

     res/
            layout/              # default (portrait)
                main.xml
            layout-land/         # landscape
                main.xml
            layout-large/        # large screen devices (portrait)
                main.xml
            layout-large-land/   # large screen devices (landscape)
                main.xml
    

答案 1 :(得分:1)

我建议您为所有具有相同名称的类似文件命名。

充分利用Android提供的限定符,例如大小或设置宽度限定符。您可以为小屏幕电话设置单一窗格布局,为平板电脑设置多窗格布局。提供多窗格布局(您可以将两个现有布局合并为一个)以横向显示是一个很好的建议。

例如:

res / layout / onepane.xml:

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

<fragment android:id="@+id/frag1"
          android:layout_height="fill_parent"
          android:name="com.example.android.dummyApp"
          android:layout_width="match_parent" 
          android:background="@drawable/bg"/>
          </LinearLayout>

RES /布局/ twopanes.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<fragment android:id="@+id/fragone"
          android:layout_height="fill_parent"
          android:name="com.example.android.dummyApp"
          android:layout_width="400dp"
          android:layout_marginRight="10dp"
          android:background="@drawable/bg"/>
<fragment android:id="@+id/fragtwo"
          android:layout_height="fill_parent"
          android:name="com.example.android.dummyApp"
          android:layout_width="fill_parent" />
         </LinearLayout>

现在已经定义了所有可能的布局,只需使用配置限定符将正确的布局映射到每个配置。您现在可以使用布局别名技术来执行此操作:

RES /值/ layouts.xml:

<resources>
<item name="main_layout" type="layout">@layout/onepane</item>
<bool name="has_two_panes">false</bool>
</resources>

RES /值-sw600dp-脊/ layouts.xml:

<resources>
<item name="main_layout" type="layout">@layout/twopanes</item>
<bool name="has_two_panes">true</bool>
</resources>

注意:值文件夹中两个xml文件中的bool值。

最小宽度限定符允许您定位具有dp中给定的特定最小宽度的屏幕。使用sw600dp代替大尺寸限定符,表示双窗格布局适用于最小宽度为600 dp的屏幕。

另外,另一种解决方案:

如果您计划针对不同的屏幕尺寸进行不同的活动,则可以为同一个项目构建多个apk。对于您要发布的每个APK,应该有一个单独的Android项目。

有关多个APK的更多信息,请查看此链接。 http://developer.android.com/training/multiple-apks/screensize.html

答案 2 :(得分:-1)

就个人而言,我制作两个不同的片段,有两个不同的片段布局,我根据布局文件夹标识符加载片段以获得正确的屏幕大小,如下所示:http://developer.android.com/training/basics/supporting-devices/screens.html

典型片段:

public class MyFragment extends Fragment implements View.OnClickListener
{
    private Button btnSave;
    private Button btnCancel;

    public MyFragment()
    {
        super();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View rootView = inflater.inflate(R.layout.fragment_myfragment_small, container, false);
        return rootView;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState)
    {
        super.onViewCreated(view, savedInstanceState);
        btnSave = (Button) getActivity().findViewById(R.id.myfragment_small_save);
        btnCancel = (Button) getActivity().findViewById(R.id.myfragment_small_cancel);

        btnSave.setOnClickListener(this);
        btnCancel.setOnClickListener(this);
    }

    @Override
    public void onClick(View v)
    {
        if (btnSave == v)
        {
            save();
        }
        else if (btnCancel == v)
        {
            cancel();
        }
    }
}

为较大的那个做同样的事情。如果通过从MyFragment扩展或通过将它们的逻辑转换为另一个类来重用save()和cancel()函数,则可以获得奖励。

静态片段链接:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <fragment
        android:id="@+id/fragment_myfragment_small"
        android:name="com.example.stuff.longer.MyFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>

fragment_myfragment_small.xml中片段的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
<Button android:id="@+id/myfragment_small_cancel"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="@string/cancel"
/>
<Button android:id="@+id/myfragment_small_save"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/myfragment_small_cancel"
        android:text="@string/save"
/>

</RelativeLayout>

为第二个更大的布局制作第二个。将布局放在不同的\ res \ layout文件夹中,例如\ res \ layout-large。