【问题标题】:One APK that launch a different activity if its mobile or tablet (Android 2.1+)一个 APK,如果它的手机或平板电脑(Android 2.1+)启动不同的活动
【发布时间】:2012-01-20 15:13:19
【问题描述】:

我进行了很多搜索,但找不到合适的信息。我的项目中有 2 项不同的活动。一开始它是 2 个不同的应用程序,一个用于移动设备,一个用于平板电脑。我想混合它们以获得一个 APK。因此,当它们分开时很容易,但混合 2 个清单我不适合我。我希望能够有 2 个不同的活动,如果这是一个移动设备,另一个是平板电脑,我希望能够有两个不同的活动和正确的一个启动。

谁有一个清单的例子可以做到这一点?

【问题讨论】:

    标签: android mobile manifest tablet


    【解决方案1】:

    为了扩展 slayton 的回答,在启动画面(或没有界面的启动器活动)中,您需要检测它是否是平板电脑。您需要自行决定什么是平板电脑。我假设您正在考虑屏幕尺寸。这是我从这里得到的一个简单示例:http://groups.google.com/group/android-developers/browse_thread/thread/d6323d81f226f93f

    它使用魔法屏幕尺寸> 6英寸来确定它是平板电脑。

    public boolean isTablet() { 
        try { 
            // Compute screen size 
            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 should have a screen size greater than 6 inches 
            return size >= 6; 
        } catch(Throwable t) { 
            Log.error(TAG_LOG, "Failed to compute screen size", t); 
            return false; 
    }
    

    一旦启动器 Activity 确定它是否是平板电脑,只需启动相应的 Activity。

    【讨论】:

    • 有没有办法使用这种方法做同样的事情:damianflannery.wordpress.com/2011/10/16/… 我喜欢这样的想法,即不需要创建一个只检测但直接在清单中执行的类。我想实现它,但不能让它工作。我的清单一定是错误的,它总是从第一个电话开始。
    • 非常酷。我不知道你能做到这一点。您是否创建了 res/values-sw600dp/bools.xml 并在清单中引用它?您运行的操作系统是否早于 Android 3.2。听起来您需要将相同的内容放入 res/values-xlarge/bools.xml 以适应旧版本。
    • 我需要它在 Android 2.1 及更高版本上工作。所以 res/values-sw600dp/bools.xml 不起作用。我试图放 res/values-large/bools.xml,而不是 res/values-xlarge/bools.xml,因为我读到 xlarge 在 2.1 中不受支持。我无法让它工作。我是 Android 开发的新手,所以我确定我做错了什么,但我不能说。这就是为什么我要寻找这样做的人。
    • @Kevin 嘿,我用屏幕尺寸超过 5 英寸(5.4 英寸)的模拟器手机进行了尝试,这里计算为 6 英寸以上并显示在平板电脑下。请帮助我如何处理这个问题。乱扔垃圾很紧急。
    • 我注意到 demianflannery.wordpress.com 的链接现在显示该技术不起作用。下面的替代建议。
    【解决方案2】:

    假设您目前有两个活动,PhoneActivity 和 TabletActivity。创建名为 SplashActivity 的第三个活动。将 SplashActivity 视为仅运行一瞬间的启动屏幕或启动器。当您的应用启动时,SplashActivity 会启动,检测设备是手机还是平板电脑,然后启动相应的活动(PhoneActivity 或 TabletActivity)。

    【讨论】:

    • 感谢您的想法。这就是我需要的,是的,但是可以直接在清单中进行。我发现这种技术听起来也很棒:damianflannery.wordpress.com/2011/10/16/…我喜欢不需要编码的想法,只需在清单中检测它。问题是我无法让它工作。
    • 我不这么认为。另一种选择是通过市场上的同一个应用程序发布两个不同的 APK,一个用于平板电脑,一个用于手机
    • 实际上我们在 Android Market 上有 2 个应用程序是的。但是您可以在平板电脑上安装手机版,在手机上安装平板电脑版。名称有助于区分它们,但是......平板电脑上的移动版本不会重新调整大小,所以至少我们可以使用它。但是手机上的平板版本一点意思都没有。
    • 我的意思是您可以通过有多个 APK 支持的 android 市场分发单个“应用程序”。您可以将市场配置为为某些设备安装某些 apk,为其他设备安装其他 apk。
    • 不知道!我需要看看它。知道这些信息在哪里可用吗?这非常非常有趣!
    【解决方案3】:

    这个条目现在已经过时了,但我没有在这个网站的其他地方找到这个问题,而且我认为这个建议可能不再正确 - 可以说即使在那时它也不是最好的,但这可能并不明显。

    最好的建议可能在:

    https://developer.android.com/guide/practices/tablets-and-handsets.html

    虽然这并不总是很清楚。我有一个类似的问题:我有一个列出一些条目(它们是日期)的应用程序,如果您单击日期,手机的行为是它会切换到包含这些日期信息的新屏幕。 [好的简化,但希望你明白]。 “新屏幕”是一个新的活动。我想设置平板电脑的行为,以便“新屏幕”位显示在日期列表的右侧或下方 - 你总能看到它。

    这两个活动都是按照标准编写的 - 没有使用框架。我必须做的主要改变是将 DetailActivity 重组为一个框架 - 围绕它的 Activity 非常薄。如果我遵循链接的指南,我也会类似地重组 MainActivity,但我没有 - 似乎没有实际需要。相反,我重写了 MainActivity 来处理 DetailFragment 是否存在 - 例如当您单击日期时,它会直接更新片段或创建打开 DetailActivity 的意图。这其中的关键部分是语句:

    mDetailFragment = (DetailFragment) getSupportFragmentManager().findFragmentById(R.id.frag_detail);
    

    在活动的 onCreate() 方法中,在 SetContentView() 之后。如果布局中不存在fragment,则在此处键入,则返回null-随后的代码中沿着“if (mDetailFragment != null)”的行有几个地方。

    这只是为平板电脑设置不同布局的问题。现在建议的方法是使用最小屏幕宽度,因此对平板电脑版本使用布局目录 layout-sw600dp。实际上,在我的用例中,我想要横向(从右到右)和纵向(详细如下)的不同布局,所以我有单独的 layout-sw600dp-land 和 layout-sw600dp-port 主活动布局文件版本。

    由此而来的敲门声,如果这种方法存在问题,那么就是这样,可能还需要复制其他布局文件。比如现有DetailsActivity的布局已经有了不同的纵向和横向版本——优化屏幕空间。事实证明,如果您将细节放在平板电脑的右侧,那么屏幕空间需要纵向 - 空间更高而不是更宽。至少这对我来说是正确的。同样,当平板竖屏时,片段的空间自然是横向的。为了解决这个问题,我将 fragment_detail.xml 文件从 layout-land 复制到 layout-sw600dp-port。如果我更改其中一个文件,我必须同时更改这两个文件。不必这样做就好了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      相关资源
      最近更新 更多