7

我正在为 Android 4.0+ 创建一个应用程序,我想实现这种行为。当用户的设备是手机时,两个不同的活动将有两个启动器图标,而在平板电脑设备上它将只有一个(活动将包含我将在一个主要活动中显示为选项卡的片段)。我知道可以在清单中设置多个启动器活动,但我认为也许我需要一些可以在运行时确定此操作的东西(在 java 代码中)。

4

5 回答 5

12

当用户的设备是手机时,两个不同的活动将有两个启动器图标,而在平板电脑设备上它将只有一个(活动将包含我将在一个主要活动中显示为选项卡的片段)。

Android中没有“手机”和“平板”的概念。我将假设您在屏幕尺寸方面区分“手机”和“平板电脑”。

如果这是真的:

步骤#1:创建一个res/values/bools.xml文件并定义两个<bool>资源,is_phone以及is_tablet. 有和有。is_phone_trueis_tabletfalse

步骤#2:创建一个res/values-.../bools.xml文件,其中...包含您在布局中使用的任何限定符,以区分“手机”和“平板电脑”(例如-large,、、、-xlarge-swNNNdp。在那里用相反的值定义相同的两个<bool>资源(即is_phoneis falseis_tabletis true)。

步骤#3:将两个活动添加到您的清单中,每个活动都为MAIN/设置LAUNCHER <intent-filter>。在您想在“电话”上使用的那个上,添加android:enabled="@bool/is_phone"<activity>元素中。在您想在“平板电脑”上使用的那个上,添加android:enabled="@bool/is_tablet"<activity>元素中。

这样,基于您用于布局的相同规则,您将拥有不同的启动器活动。


显然,这是行不通的,尽管我发誓曾经这样做过。

另一种选择是让一个活动成为MAIN/LAUNCHER一个。用 设置它android:theme="@style/Theme.NoDisplay",所以它没有 UI。让它在 Java 中确定onCreate()哪个“真正的”入口点活动适合给定的屏幕大小,可能使用bool我上面引用的相同资源。然后让它调用startActivity()以将控制权传递给正确的活动调用finish()自身(因此用户不会在 BACK 堆栈上遇到不可见的活动)。这种技术也用于无法通过清单来控制它的情况,例如“我们是否有 Maps V1”,您android:required="false"<uses-library>元素上有。

于 2013-05-14T12:00:35.937 回答
1

为什么要承受这么大的痛苦?只需为手机和平板电脑设计单独的应用程序(确保它们具有相同的包名称)。Multiple APKs是你应该寻找的:

Although we encourage you to develop and publish a single APK that supports as many device
configurations as possible, doing so is sometimes not possible. To help you publish your
application for as many devices as possible, Google Play allows you to publish multiple 
APKs under the same application listing. Google Play then supplies each APK to the 
appropriate devices based on configuration support you've declared in the manifest file of 
each APK. 

这是一个链接:http: //developer.android.com/google/play/publishing/multiple-apks.html

于 2013-05-14T09:47:30.610 回答
1

在您的应用程序首次启动时,您可以以编程方式检查您的设备是平板电脑还是手机。如果是手机,您可以通过编程方式将快捷方式添加到主屏幕,并指定启动器应使用的 Intent,以便转到正确的 Activity。

首先,在您的清单中,您将只有一个启动器,但您将有一个没有意图过滤器的 Activity,它将从以编程方式创建的快捷方式打开。

接下来,在您的启动器 Activity 的 onCreate 中,检查您是否已经创建了快捷方式。根据我的阅读,最好的方法是使用布尔值SharedPreferences

SharedPreferences prefs = getSharedPreferences(getPackageName(), MODE_PRIVATE);
if (!prefs.getBoolean("shortcut", false)) {
    if (!isTablet(this)) {
        createShortcut();
    }
    prefs.edit().putBoolean("shortcut", true).commit();
}
else {
    //if the shortcut has already been made, see if that is what was used to open this app
    if (getIntent() != null) {
        if (getIntent().getBooleanExtra("shortcut", false)) {
            //the shortcut was used, so open the other Activity:
            Intent shortcut = new Intent(this, OtherActivity.class);
            startActivity(shortcut);
        }
    }
}

接下来,您需要定义所谓的平板电脑。这是基于屏幕的与密度无关的像素。例如,要调用具有 7 英寸屏幕平板电脑的设备,此数字为 600。对于较大的设备 - 例如 10 英寸屏幕,此数字为 720。将此数字存储在变量中:

private static final int TABLET_DP = 600;

然后添加上面使用的方法:

public static boolean isTablet(Context context) {
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);\
    Display display = wm.getDefaultDisplay();
    DisplayMetrics outMetrics = new DisplayMetrics();
    display.getMetrics(outMetrics);
    float density  = context.getResources().getDisplayMetrics().density;
    float dpWidth  = outMetrics.widthPixels / density;
    return dpWidth >= TABLET_DP;
}

private void createShortcut() {

    //this is the intent that will be used when the shortcut is clicked.
    Intent shortcutIntent = new Intent(Intent.ACTION_MAIN);
    shortcutIntent.setClassName(this, this.getClass().getName());
    shortcutIntent.putExtra("shortcut", true);

    //this is the intent used to create the shortcut.
    Intent intent = new Intent();
    intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));//or however you want the shortcut to be labeled.
    Parcelable iconResource = Intent.ShortcutIconResource.fromContext(
            this,  R.drawable.ic_launcher);//or whatever you want the icon to be
    intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
    intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");

    //tell Android to create the shortcut
    context.sendBroadcast(intent);
}

最后,确保您具有安装快捷方式的正确权限:

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"></uses-permission>
于 2014-04-29T19:18:19.967 回答
0

我可能在这里打败了一匹死马,但是使用布局别名呢?

使用布局别名

于 2014-04-25T20:48:28.763 回答
-1

您将需要制作多个 apk,一个用于选项卡,一个用于手机,唯一的区别是这些 apk 中的清单文件。休息你可以用代码来管理。

于 2013-05-14T09:14:43.287 回答