如何在Android中以编程方式查找平板电脑或手机?

时间:2013-05-28 04:53:59

标签: android android-layout

我的情况是手机和平板电脑的逻辑相同。但布局略有不同。我尝试使用以下代码

public static boolean findoutDeviceType(Context context) 
    {
        return (context.getResources().getConfiguration().screenLayout & 
                       Configuration.SCREENLAYOUT_SIZE_MASK)>= 
                           Configuration.SCREENLAYOUT_SIZE_LARGE;
    }

Samsung Tab 10“的分辨率为1280 * 800,S3的分辨率为1270 * 720.此代码返回Tab和Phone的尺寸为XLarge,因为其检查条件为> 960 * 720。

我已经测试过在Res作为Layout,Layout-Large和Layout-xLarge的布局文件夹中插入相应的UI。但这无论如何都没有影响。检查时从Layout文件夹中获取了UI。

无论如何,即使我将UI放在不同的布局文件夹中,我也必须在类文件中检查它们以设置相应的ContentView。

有没有其他方法可以找到它?

9 个答案:

答案 0 :(得分:45)

Android培训中讨论了这个主题:

http://developer.android.com/training/multiscreen/screensizes.html#TaskUseSWQuali

如果您阅读整个主题,他们会解释如何在特定值文件中设置布尔值(res/values-sw600dp/):

<resources>
    <bool name="isTablet">true</bool>
</resources>

因为sw600dp限定符仅对android 3.2以上的平台有效。如果您想确保此技术适用于所有平台(3.2之前),请在res/values-xlarge文件夹中创建相同的文件:

<resources>
    <bool name="isTablet">true</bool>
</resources>

然后,在“标准”值文件(作为res/values/)中,将布尔值设置为false:

<resources>
    <bool name="isTablet">false</bool>
</resources>

然后在您的活动中,您可以获取此值并检查您是否在平板电脑尺寸设备中运行:

boolean tabletSize = getResources().getBoolean(R.bool.isTablet);

这不是我的逻辑,为了这个简单易行的方法,Credit转到ol_v_er。我只是复制了它。

您可以查看原始答案 here

一些其他信息

您现在已经标记了您的应用程序是在手机还是平板电脑上运行。

我创建了两个用于处理UI及其功能的包,

com.phone
com.tablet

您将控件重定向到所需的包

boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
if (tabletSize) {
    // do something
    //Start activity for tablet
} else {
    // do something else
    //Start activity for phone     
}

Refer

注意:我认为对于10英寸和7英寸的屏幕应用都会从res/values-sw600dp/获取资源。但更具体地说,我认为对于10英寸平板电脑屏幕,我们可以使用res/values-sw720dp/

<resources>
    <bool name="isTablet">true</bool>
</resources>

答案 1 :(得分:16)

试试这个

    public boolean isTablet(Context context) {
        boolean xlarge = ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4);
        boolean large = ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE);
        return (xlarge || large);
    }

如果您使用平板电脑,它将返回true。它已经在三星Galaxy Tab 7“和三星Galaxy S3上进行了检查。

答案 2 :(得分:3)

例如,您可以设置一些res-values文件夹:

RES /值-XLARGE RES /值-大 res / values-sw600dp

等。然后你可以为每一个声明一个布尔值:

    <resources>
<bool name="isXLarge">true</bool>
    </resources>

    <resources>
<bool name="isLarge">true</bool>
    </resources>

你可以通过

获得价值
   boolean xlargeValue = getResources().getBoolean(R.bool.isXlarge);
   boolean largevalue = getResources().getBoolean(R.bool.isLarge);
   boolean tabletValue = getResources().getBoolean(R.bool.sw620dp):

答案 3 :(得分:1)

试试这段代码。您可以获得屏幕英寸,根据大小,您可以获得平板电脑或Android设备

 String inputSystem;
    inputSystem = android.os.Build.ID;
    Log.d("hai",inputSystem);
    Display display = getWindowManager().getDefaultDisplay(); 
    int width = display.getWidth();  // deprecated
    int height = display.getHeight();  // deprecated
    Log.d("hai",width+"");
    Log.d("hai",height+"");
    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    double x = Math.pow(width/dm.xdpi,2);
    double y = Math.pow(height/dm.ydpi,2);
    double screenInches = Math.sqrt(x+y);
    Log.d("hai","Screen inches : " + screenInches+"");

答案 4 :(得分:1)

使用不同的资源文件,而不是尝试以编程方式确定它。这对于大多数情况来说已经足够了,而且是documentation推荐的内容。

enter image description here

请参阅我更全面的答案here

答案 5 :(得分:1)

旧问题,但这可能会对某人有所帮助。 如果要确定设备是平板电脑(屏幕大于7英寸)还是手机,则可以使用以下util方法:

科特琳

fun isTablet(): Boolean {
    return App.instance.resources.configuration.smallestScreenWidthDp >= 600
}

Java

public static Boolean isTablet(){
    return App.instance.resources.configuration.smallestScreenWidthDp >= 600
}

App.instance是复制实例。

答案 6 :(得分:0)

这在我的应用中非常有效:

//*[@id('ctl00_left_content')/x:div[4]/x:div[1]/x:table/x:tbody/x:tr/x:td[5]/x:p/x:a[2]/x:img]"

答案 7 :(得分:0)

public boolean isTablet() { 
try { 
    // Compute screen size 
 Context context = this;
    DisplayMetrics dm = 
 context.getResources().getDisplayMetrics(); 
    float screenWidth  = dm.widthPixels / dm.xdpi; 
    float screenHeight = dm.heightPixels / dm.ydpi; 
    double size = Math.sqrt(Math.pow(screenWidth, 2) + 
                            Math.pow(screenHeight, 2)); 
    // Tablet devices have a screen size greater than 6 
      inches 
    return size >= 6; 
  } catch(Throwable t) { 
    Log.e("Failed to compute screen size", t.toString()); 
    return false; 
  } 

}

答案 8 :(得分:0)

所有其他问题都使用资源限定符和方法,它们不代表设备的物理尺寸,而是代表可用屏幕尺寸。例如,在多窗口模式下,由于该应用程序的可用屏幕尺寸变小,系统将从“ values”文件夹中获取资源,而不是“ values-large”。要确定物理设备是平板电脑还是手机,请使用以下方法(我使用640x480dp作为平板电脑的最小尺寸,即large设备的定义,请随时更改这些尺寸常数):

fun isTablet(context: Context): Boolean {
    val outSize = Point()
    val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    windowManager.defaultDisplay.getRealSize(outSize)
    outSize.x = pxToDp(windowManager, outSize.x)
    outSize.y = pxToDp(windowManager, outSize.y)
    val shorterSideDp: Int
    val longerSideDp: Int
    if (outSize.x > outSize.y) {
        shorterSideDp = outSize.y
        longerSideDp = outSize.x
    } else {
        shorterSideDp = outSize.x
        longerSideDp = outSize.y
    }
    return shorterSideDp > 480 && longerSideDp > 640
}

将PX转换为DP的功能

@Dimension(unit = Dimension.DP)
fun pxToDp(windowManager: WindowManager, @Dimension(unit = Dimension.PX) px: Int): Int {
    val displayMetrics = DisplayMetrics()
    windowManager.defaultDisplay.getRealMetrics(displayMetrics)
    return (px / displayMetrics.densityDpi.toFloat() * DisplayMetrics.DENSITY_DEFAULT).roundToInt()
}