31

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

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

三星 Tab 10" 的分辨率为 1280 * 800,S3 的分辨率为 1270 * 720。此代码将 Tab 和 Phone 的 Size 返回为 XLarge,因为其检查标准为 > 960 * 720。

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

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

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

4

10 回答 10

62

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

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

这是实现

这种简单易行的方法归功于 ol_v_er

一些附加信息

您现在有标志表明您的应用程序是在手机还是平板电脑上运行。

我创建了两个包来处理 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     
}

参考

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

<resources>
    <bool name="isTablet">true</bool>
</resources>
于 2013-05-28T05:13:27.200 回答
17

尝试这个

    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 上进行过检查。

于 2013-05-28T05:21:23.397 回答
3

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

res/values-xlarge res/values-large 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):
于 2013-05-28T05:08:22.110 回答
3

试试这个代码,你的应用程序正在运行的设备手机或平板电脑很容易在里面调用 oncreate() 方法

isTabletDevice(活动)

private static boolean isTabletDevice(Context activityContext) {

    boolean device_large = ((activityContext.getResources().getConfiguration().screenLayout &
          Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE)
    DisplayMetrics metrics = new DisplayMetrics();
    Activity activity = (Activity) activityContext;
    activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
    if (device_large) {
        //Tablet
        if (metrics.densityDpi == DisplayMetrics.DENSITY_DEFAULT){              
            return true;
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_MEDIUM){
            return true;    
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_TV){
            return true;    
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_HIGH){
            return true;    
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_280){
            return true;    
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_XHIGH) {
            return true;
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_400) {
            return true;
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_XXHIGH) {
            return true;
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_560) {
            return true;
        }else if(metrics.densityDpi == DisplayMetrics.DENSITY_XXXHIGH) {
            return true;
        }            
    }else{
        //Mobile
         } 
    return false;
}
于 2015-12-21T08:47:36.187 回答
2

老问题,但这可能会对某人有所帮助。如果您想了解设备是平板电脑(屏幕大于 7")还是手机,您可以使用此 util 方法:

科特林

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

爪哇

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

App.instance 是应用程序实例。

于 2019-04-05T10:14:57.617 回答
2
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; 
  } 

}

于 2019-04-17T17:58:47.663 回答
1

试试这个代码。你可以得到屏幕英寸,根据尺寸你可以得到平板电脑或安卓设备

 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+"");
于 2013-05-28T04:59:31.403 回答
1

使用不同的资源文件而不是尝试以编程方式确定它。这对于大多数情况来说已经足够了,并且是文档所建议的。

在此处输入图像描述

在这里查看我更完整的答案。

于 2017-01-14T03:16:03.060 回答
0

所有其他问题都使用资源限定符和方法,它们不代表设备的 PHYSICAL 大小,而是 AVAILABLE 屏幕大小。例如,在多窗口模式下,系统将从“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()
}
于 2020-04-17T12:50:17.903 回答
-1

这在我的应用程序中运行良好:

private boolean isPhoneDevice(){

    return getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY);

}
于 2016-09-22T17:11:38.037 回答