在Android中为不同的布局分隔不同的编程逻辑的最佳方法是什么?

时间:2012-07-30 07:23:13

标签: android android-layout

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

我的错误是什么:如何找到我的代码中使用的布局。 对于不同的布局,我的片段需要稍微不同的代码。

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

我的方法现在有点hacky并且与不同的Layout文件夹不同步。

  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{
//
}

2 个答案:

答案 0 :(得分: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...

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

答案 1 :(得分:1)

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

How can I detect which layout is selected by Android in my application?

如果您希望看到最佳答案,可以选择两个选项。

  1. 第一个是使用config作为您的values文件夹,然后从那里获取xml文件中的String并交叉检查它。 (将其用作旗帜)。
  2. https://stackoverflow.com/a/11670441/603744

    1. 下一个是将Tag设置为您的布局,并从您的代码中获取标签,以找出它打印的标签,并根据该标签找到它所使用的布局。但是你还必须注意到这种方法存在一些小错误。但我还没累呢。
    2. https://stackoverflow.com/a/11205220/603744