我可以以编程方式选择Android布局文件夹吗?

时间:2012-01-20 15:15:14

标签: android layout dynamic directory screen-size

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

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

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

这可能吗?

3 个答案:

答案 0 :(得分:6)

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

布局 - 小屏幕设备小 layout-ldpi用于低密度设备 locale en for locales ...

阅读this它会对你有很大的帮助

但总的来说,没有程序化的方法可以做到这一点,也许有一些解决方法,但我不鼓励这样做。

也许您需要看一下片段设计,以了解gui在平板电脑和手机等不同设备上的开发......

答案 1 :(得分: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等文件添加到其他文件夹中。

答案 2 :(得分: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会照常正常选择。