5

我为不同的屏幕尺寸和设备使用不同的布局。我使用带有特定布局文件夹的片段。这个概念很棒,对于具有大屏幕的平板电脑和设备,我在 layout-sw600dp中放置了一个布局文件,Android 设法在不同的设备上提供正确的布局。

困扰我的是:如何找出代码中使用的布局。对于不同的布局,我的片段需要稍微不同的代码。

一般来说,在我的片段/活动中分离自定义布局编程逻辑的最佳实践是什么?

我现在的方法有点老套,与不同的布局文件夹不同步。

  private boolean isTabletDevice() {
    if (android.os.Build.VERSION.SDK_INT >= 11) { // honeycomb
      // test screen size, use reflection because isLayoutSizeAtLeast is
      // only available since 11
      Configuration con = getResources().getConfiguration();
      try {
        Method mIsLayoutSizeAtLeast = con.getClass().getMethod("isLayoutSizeAtLeast", int.class);
        Boolean r = (Boolean) mIsLayoutSizeAtLeast.invoke(con, 0x00000004); // Configuration.SCREENLAYOUT_SIZE_XLARGE
        return r;
      } catch (Exception x) {
        x.printStackTrace();
        return false;
      }
    }
    return false;
  }

接着

if(isTabletDevice()) {
//findViewById(R.id.onlyInTabletLayoutButton);
}else{
//
}
4

2 回答 2

2

这是我个人使用的方法:

在每个布局中,我将一个Tag添加到布局的根,并确保所有布局根都具有相同的 id。因此,例如,我将有一个类似于以下内容的布局:

<RelativeLayout
android:id="@+id/rootView"
android:tag="landscapehdpi">
<!-- Rest of layout -->
</RelativeLayout> 

然后有另一个像:

<RelativeLayout
android:id="@+id/rootView"
android:tag="portraitmdpi">
<!-- Rest of layout -->
</RelativeLayout> 

然后,一旦布局膨胀,我使用:

View rootView = (View) findViewById(R.id.rootView);

这将返回当前正在使用的布局根。现在要确定它到底是哪个布局并运行适当的代码,我使用了一系列 if-else 块:

String tag = rootView.getTag().toString();

if(tag.equals("landscapehdpi"))
{
//Code for the landscape hdpi screen
}
else if(tag.equals("portraitmdpi"))
{
//Code for the portrait mdpi screen
}
//And so on...

所以基本上使用它你可以知道在运行时加载了哪个布局,并运行适当的代码。

于 2012-07-30T08:15:49.463 回答
1

我认为您正在寻找与此问题相同的解决方案,

如何检测 Android 在我的应用程序中选择了哪个布局?.

如果您想查看最佳答案,有两个可用选项。

  1. 第一个是为您的值文件夹使用配置,并从那里从您的 xml 文件中获取字符串并交叉检查它。(将其用作标志)。

https://stackoverflow.com/a/11670441/603744

  1. 下一个是将标签设置为您的布局,并从您的代码中获取标签以找出它打印的标签,并根据该标签找到它使用的布局。但是您还必须注意,这种方法存在一个小错误。但我还没有让他们感到厌烦。

https://stackoverflow.com/a/11205220/603744

于 2012-07-30T07:40:42.103 回答