我正在为Android 4.0+创建一个应用程序,我希望实现此行为。当用户的设备是电话时,两个不同的活动将具有两个启动器图标,并且在平板电脑设备上它将只是一个(活动将包括我将在一个主要活动中显示为标签的片段)。我知道可以在清单中设置多个启动器活动,但我想我可能需要在运行时(在java代码中)确定此操作的东西。
答案 0 :(得分:12)
当用户的设备是手机时,两个不同的活动将有两个启动器图标,它将只是一个(活动将包含我将在一个主要活动中显示为选项卡的片段)。
“手机”和“平板电脑”的Android中没有概念。我将假设您在屏幕尺寸方面区分“手机”和“平板电脑”。
如果是这样的话:
步骤1:创建res/values/bools.xml
文件并定义两个<bool>
资源,is_phone
和is_tablet
。 is_phone
为true
,is_tablet
为false
。
步骤2:创建一个res/values-.../bools.xml
文件,其中...
是您在布局中使用的限定符,用于区分“手机”和“平板电脑”(例如-large
, -xlarge
,-swNNNdp
)。使用相反的值定义相同的两个<bool>
资源(即is_phone
为false
,is_tablet
为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"
,因此没有用户界面。让它在Java中,在onCreate()
中确定哪些“真正的”入口点活动适合给定的屏幕大小,可能使用我上面引用的相同bool
资源。然后让它调用startActivity()
将控制传递给正确的活动和调用finish()
本身(这样用户就不会在BACK堆栈上遇到不可见的活动)。此技术也可用于无法通过清单控制此问题的情况,例如“我们是否有地图V1”,android:required="false"
元素上有<uses-library>
。
答案 1 :(得分: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
答案 2 :(得分:1)
首次启动应用程序时,您可以通过编程方式检查您的设备是平板电脑还是手机。如果是手机,您可以通过编程方式向主屏幕添加快捷方式,并指定启动器应使用的意图,以便转到正确的活动。
首先,在你的Manifest中,你将只有一个启动器,但是你将拥有一个没有意图过滤器的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>
答案 3 :(得分:0)
您需要制作多个apks,一个用于标签,一个用于电话,唯一的区别是这些apks中的清单文件。您可以使用代码进行管理。
答案 4 :(得分:0)
我可能会在这里击败死马,但是如何使用布局别名?