我的情况是手机和平板电脑的逻辑相同。但布局略有不同。我尝试使用以下代码
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。
有没有其他方法可以找到它?
答案 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
}
注意:我认为对于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)
答案 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()
}