我能否通过编程方式选择Android布局文件夹?

6
我正在开发一个Android应用程序,它根据屏幕大小使用不同的布局文件夹(例如large、xlarge等)进行调整大小。
唯一的问题是,我想为用户提供一种在小屏幕和大屏幕布局之间切换的方法,以防他们有一个不识别xlarge标签的预蜂窝平板电脑,或者设备接近手机大小但仍足够大,用户希望使用平板电脑布局。
有没有办法创建一个按钮来切换布局文件夹?我仍然想使用基于屏幕大小的自动文件夹选择,我只是还想能够强制应用程序使用其中一个文件夹。这是否可行?
3个回答

6
安卓团队鼓励您使用资源限定符来支持多种设备。例如:
- layout-small适用于小屏幕设备 - layout-ldpi适用于低密度设备 - layout-en适用于地区设置...
阅读此文将对您有很大帮助:点击这里
但通常情况下,无法以编程方式实现这一点。也许有一些变通方法,但我不建议这样做。
另外,您可能需要查看片段设计,以了解针对不同设备(如平板电脑和手机)的GUI开发。

2

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

只需在您的layout和layout-land文件夹中添加各种布局文件,例如:

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这样的文件添加到其他文件夹中。


但是选择了哪个 R.layout.my_layout_qvga 呢?在 layout 中的还是在 layout-land 中的? - David T.

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将像往常一样适当地选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接