Android 4.0 以降用のアプリケーションを作成していますが、この動作を実現したいと考えています。ユーザーのデバイスが電話の場合、2 つの異なるアクティビティには 2 つのランチャー アイコンがあり、タブレット デバイスでは 1 つのみになります (アクティビティは、1 つのメイン アクティビティでタブとして表示されるフラグメントで構成されます)。マニフェストで複数のランチャー アクティビティを設定できることはわかっていますが、実行時にこの操作を決定する何かが必要になると思います (Java コードで)。
5 に答える
アプリケーションの初回起動時に、デバイスがタブレットかスマートフォンかをプログラムで確認できます。電話の場合は、プログラムでホーム画面にショートカットを追加し、正しいアクティビティに移動するためにランチャーが使用するインテントを指定できます。
まず、マニフェストにはランチャーが 1 つしかありませんが、プログラムで作成されたショートカットから開かれるインテント フィルターのないアクティビティがあります。
次に、ランチャー アクティビティの 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>
ここで死んだ馬を打ち負かしているかもしれませんが、レイアウトエイリアスを使用するのはどうですか?
タブ用と電話用の複数の apk を作成する必要があります。唯一の違いは、これらの apk のマニフェスト ファイルです。コードで管理できる残りの部分。