5

我正在构建一个 Android 应用程序,它使用不同的布局文件夹(即大、xlarge 等)根据屏幕大小调整大小。

唯一的问题是我想为用户提供一种在小屏幕和大屏幕布局之间切换的方法,以防他们有一个无法识别 xlarge 标签的 pre-honeycomb 平板电脑,或者设备更接近手机尺寸但仍然足够大,用户想要使用平板电脑布局。

有没有办法可以创建一个按钮来切换布局文件夹?我仍然想使用基于屏幕大小的自动文件夹选择,我还希望能够强制应用程序使用一个文件夹或另一个。

那可能吗?

4

3 回答 3

6

android 团队鼓励您将资源限定符用于任何类型的多设备支持。例如

layout-small 适用于小屏幕设备 layout-ldpi 适用于低密度设备 layout-en 适用于语言环境...

阅读此书对您有很大帮助

但通常不,没有编程方式可以做到这一点,也许有一些解决方法,但我不鼓励这样做。

另外,也许您需要查看片段设计以了解针对平板电脑和手机等不同设备的 gui 开发......

于 2012-01-20T15:27:28.723 回答
2

是的你可以。这很简单!我这样做是因为旧版(API 级别 13 之前)系统不支持较新的布局文件夹过滤器。具体来说,我需要区分 QVGA(小)与 WQVGA(正常)和其他正常分辨率。

只需将各种布局文件添加到您的布局和布局地文件夹中,例如

layout
    my_layout_default.xml
    my_layout_qvga.xml
layout-land
    my_layout_default.xml
    my_layout_qvga.xml

然后,在运行时选择适当的布局:

protected void onCreate(Bundle savedInstanceState)
{
    // Some code that uses DisplayMetrics to determine the screen type
    ScreenType st = Util.getScreenType(this);
    super.onCreate(savedInstanceState);
    setContentView(st == ScreenType.ST_QVGA ? R.layout.my_layout_qvga : R.layout.my_layout_default);
    // ...

您可以为每个布局添加一个标签,以发现实际加载了哪个布局,如果您愿意,例如

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/my_root_view"
    android:tag="st_port_QVGA"

FrameLayout flRoot = (FrameLayout)findViewById(R.id.my_root_view);
Object objTag = flRoot.getTag();
if (objTag instanceof String)
{
    String strTag = (String)objTag;
    System.out.println("Tag = " + strTag);
}

顺便说一句,没有理由不能将此技术与通常的资源限定符结合使用,例如将 my_layout_default.xml 之类的文件添加到其他文件夹。

于 2013-09-17T11:22:17.147 回答
1

我遇到了非常相似的情况。我的细节片段通常全屏显示,但在平板电脑上,它有时只能占据屏幕宽度的 70%(在主从流中)。当细节片段在平板电脑上全屏时,它应该使用大布局。当细节片段只有宽度的 70% 时,它应该使用较小的手机布局。这是我的处理方式。

我有一个像这样的fragment_detail.xml

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

    <include layout="@layout/fragment_detail_force_phone" />

</LinearLayout>

包含fragment_detail_force_phone.xml小屏幕的实际布局(或者当它显示在只有 70% 宽度的平板电脑上时)。这避免了代码重复。

大布局在sw600dp/fragment_detail.xml. 当我膨胀细节片段时,我会检查getActivity()这个片段是否被加载到一个狭窄的空间中,这意味着我想强制手机布局。如果是这样的话,我会膨胀R.layout.fragment_detail_force_phone。由于该布局没有平板电脑版本,因此如果我指定,它总是会加载电话代码。否则,我会膨胀R.layout.fragment_detail,Android 会像往常一样适当地选择。

于 2016-07-31T03:02:37.580 回答