Android 检测';Phablets&x27;如布局的注释3

Android 检测';Phablets&x27;如布局的注释3,android,android-layout,Android,Android Layout,我试图在Android(ICS+)中区分note 3等大型设备的布局,但发现如果不读取设备名称或尝试在代码中计算物理大小,这几乎是不可能的 note 3的(已弃用)size属性标识为正常,HTC One Mini也是如此 同样适用于使用sw350dp/xxhdpi。不确定HTC Mini是否是这里不寻常的设备,但我想所有更新的高端Mini手机都是一样的。如果我可以帮助的话,我也不想使用px值,因为较小的设备可以(而且可能会)达到1080p,而3之前的注释使用较低的值 这里有我遗漏的东西吗?如果没

我试图在Android(ICS+)中区分note 3等大型设备的布局,但发现如果不读取设备名称或尝试在代码中计算物理大小,这几乎是不可能的

note 3的(已弃用)size属性标识为正常,HTC One Mini也是如此

同样适用于使用sw350dp/xxhdpi。不确定HTC Mini是否是这里不寻常的设备,但我想所有更新的高端Mini手机都是一样的。如果我可以帮助的话,我也不想使用px值,因为较小的设备可以(而且可能会)达到1080p,而3之前的注释使用较低的值

这里有我遗漏的东西吗?如果没有,是否有可靠的方法来计算物理尺寸,或者我最好使用硬编码设备列表来提供最佳布局

编辑

这部分是由于多个覆盖布局文件夹导致了一些有趣的事情,我现在有了使用正确值的Mini,但是我仍然与使用相同资源的S4和Note 3处于相同的情况。虽然这没有那么糟糕,但它仍然不是最优的


我希望注释1和注释2也会返回到较低的DPI资源,这意味着它们的不动产也不会被利用。

将此代码复制并粘贴到您的活动中,当执行此代码时,它将显示设备的屏幕大小类别

int screenSize = getResources().getConfiguration().screenLayout &
        Configuration.SCREENLAYOUT_SIZE_MASK;

String toastMsg;
switch(screenSize) {
    case Configuration.SCREENLAYOUT_SIZE_LARGE:
        toastMsg = "Large screen";
        break;
    case Configuration.SCREENLAYOUT_SIZE_NORMAL:
        toastMsg = "Normal screen";
        break;
    case Configuration.SCREENLAYOUT_SIZE_SMALL:
        toastMsg = "Small screen";
        break;
    default:
        toastMsg = "Screen size is neither large, normal or small";
}
Toast.makeText(this, toastMsg, Toast.LENGTH_LONG).show();
或者另一方面,你可以得到屏幕尺寸英寸和分类,它作为你的要求

 DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    double x = Math.pow(dm.widthPixels/dm.xdpi,2);
    double y = Math.pow(dm.heightPixels/dm.ydpi,2);
    double screenInches = Math.sqrt(x+y);
    Log.d("debug","Screen inches : " + screenInches);

screenInches=  (double)Math.round(screenInches * 10) / 10;
我是如何在我的项目中处理这个问题的…
进行不同的活动,
并相应地设置内容视图。
我希望你能找到一个更好的解决办法,但看起来,这是唯一的办法

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        double x = Math.pow(dm.widthPixels / dm.xdpi, 2);
        double y = Math.pow(dm.heightPixels / dm.ydpi, 2);
        screenInches = Math.sqrt(x + y);
        Log.i("Screen inches : ", "" + screenInches);
        removeGarbage();
        if(screenInches<=6){
            setContentView(R.layout.activity_management);
        }
        else {
            setContentView(R.layout.activity_tab_managment);
        }

        // Do whatever you want
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
DisplayMetrics dm=新的DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
double x=Math.pow(dm.widthPixels/dm.xdpi,2);
双y=数学功率(dm.heightPixels/dm.ydpi,2);
屏幕英寸=数学sqrt(x+y);
Log.i(“屏幕英寸:,”+屏幕英寸);
removeGarbage();

如果(屏幕英寸不使用屏幕大小方法。一些拥有Galaxy Mega 5.8/6.3设备或Nexus 6的phablet用户可能会有意外体验

使用基于资源的方法
sw600dp
sw720dp
,如下链接所示


sw350dp
以密度无关的像素测量。“较小的设备可以(也可能会)达到1080p”--但在密度无关的像素中,它们将保持相同的大小。在phablet场景中使用
-swNNNdp
-wNNNdp
、和
-hNNNdp
。@是的,但我不知道如何区分物理大小的布局-否则,触摸区域之类的东西就会成为问题。“物理小”=与密度无关的像素数量较少。“物理上较大”=更高的密度无关像素数。选择要更改UI的值,就像网页设计师为CSS媒体查询选择
dp
值来决定何时应用某些CSS规则一样。@Commonware本质上我是在尝试决定在gridview中显示3列还是4列。HTC Mini和SGS注3,它们具有相同的软件dp大小,并且都是xxhdpi-我不确定这会有什么帮助…我可以在两个设备上显示相同的布局,但文本和触摸区域变得太小。“HTC Mini和SGS注3,它们具有相同的软件dp大小”--那么它们的物理尺寸是相同的。
1dp
=1/160英寸,适用于所有设备。如果它们的物理尺寸不相同,则可能是您的计算错误,或者某个制造商将报告的密度搞砸了。屏幕尺寸不受欢迎,正如我所说的,注释3将其标识为“正常”,H也一样TC One Mini。至于第二部分,这可靠吗?我已经读到有人对类似的方法有问题…对于第二部分,你肯定应该尝试,因为它对我来说很好,我在三星S3、HTC M8、Xperia Z、Nexus 7(标签)上试过和三星Galaxy Tab 4…因为你需要一个粗略的想法,它会很好地工作。我会在周一看一看,让你知道我怎么做。我希望有更干净的东西,但看起来这是目前唯一的办法。下半场的反应确实如预期的那样,但这是一个巨大的黑客真的-我将不得不处理一堆的样式,以便我希望能找到一个更好的处理方法。