FindViewById和不同屏幕密度的多种布局(Android)

时间:2012-06-06 07:37:41

标签: java android android-layout

我的问题与在Android平台上针对不同屏幕密度使用不同的布局有关。

假设我有四个main.xml文件(每个文件位于各自的文件夹中,用于相应的屏幕密度:ldpi,mdpi,hdpi和xhdpi),让我们说它们都是相同的。但是,我想说我想摆脱ldpi布局的一些UI元素。当我试图在ldpi手机上的ldpi布局中找到该视图时,如何处理Java端以避免空指针异常?我应该检查并查看findviewbyid是否返回null并从那里继续前进?

我意识到你应该在你的应用程序中保持统一,但有时似乎只是摆脱一个方便但不必要的UI元素更有意义。我喜欢在这些新手机上拥有额外的空间,但是如果/什么时候制作ldpi布局,我宁愿不只是把它放在那里当它看起来更好只是为了摆脱一些东西,如果这有意义的话!

3 个答案:

答案 0 :(得分:2)

这是一个很好的问题。空检查可以是解决方案之一。 另一个解决方案是检查屏幕属性看看这个例子:

public static boolean isTabletPC(Context context) {
        boolean isHoneycomb = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB;
        boolean hasLargeScreen = (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK)
                >= Configuration.SCREENLAYOUT_SIZE_LARGE;
        return isHoneycomb & hasLargeScreen;
    }

答案 1 :(得分:0)

这与处理任何可选元素的方式相同。检查它是否存在(非空)并相应处理。如果不存在ViewfindViewById将返回null,您可以在View块内if(null != view){}进一步操作,或者如果有多个可选元素可以如果要分组,您可以使用实例变量。

HoneycombGallery演示了解如何使用布局检测设备属性(尽管在演示中,它是针对片段完成的,但它可以应用于任何视图)

答案 2 :(得分:0)

从api lvl 11你可能想要使用fragments。通过这种方式,您的Java代码始终处理明确存在的视图,并且您的布局可以显示(或不显示)处理自己业务的某些片段。

我建议不要乱丢你的代码,检查你有什么样的屏幕,并检查屏幕上是否有某个视图。

如果您查看链接页面上的图1,您会看到一个明确的例子:

fragments on different devices