我正在构建一个Android应用,根据屏幕大小调整大小,使用不同的布局文件夹(即大,xlarge等)。
唯一的问题是,我想为用户提供一种在小屏幕和大屏幕布局之间切换的方法,以防它们有一个无法识别xlarge标签的预蜂窝平板电脑,或者设备更接近电话尺寸,但仍然足够大,用户想要使用平板电脑布局。
有没有办法可以创建按钮来切换布局文件夹?我仍然想根据屏幕大小选择自动文件夹,我也希望能够强制应用程序使用一个文件夹或另一个文件夹。
这可能吗?
答案 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会照常正常选择。