[被修改]: 我已经开发了一个适用于不同屏幕大小的手机和平板电脑的应用程序,我按照Android指南来创建不同的UI布局集,以满足不同大小的屏幕(手机和平板电脑),所有布局都将在纵向模式。在此之前一切正常但现在我有一个新的要求,其中平板电脑的布局将被更改,即它将有一些额外的信息而不是电话布局,所有新的布局将采用横向模式。
现在我怀疑是:
请建议我处理这种情况的最佳方法。
答案 0 :(得分:3)
开始这一点的好处是官方Android文档(链接下方)。
简而言之,我可以告诉您必须创建多个布局以满足您支持多种屏幕尺寸/分辨率的要求。在您的应用程序源目录中,您必须在不同的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。