▼Androidメモ▼
ホームスクリーン


ホームスクリーンとなるプログラムを作成する。



ソースコード
HomeEx.jav
package net.npaka.homeex;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;

//ホームスクリーン
public class HomeEx extends Activity
implements AdapterView.OnItemClickListener {
private final static int MP=LinearLayout.LayoutParams.MATCH_PARENT;
private ArrayList<AppInfo> appInfos; //アプリ情報群
private BroadcastReceiver appReceiver;//アプリ登録解除レシーバー
private GridView gridView; //グリッドビュー
private int iconSize; //アイコンサイズ

//アクティビティ起動時に呼ばれる
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);

//アイコンサイズの計算
DisplayMetrics metrics=new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
iconSize=(int)(48.0f*metrics.density);
android.util.Log.e("debug","fla>>"+iconSize);

//レイアウトの生成
LinearLayout layout=new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
setContentView(layout);

//グリッドビューの生成
gridView=new GridView(this);
gridView.setBackgroundColor(Color.argb(200,0,0,0));
gridView.setLayoutParams(new LinearLayout.LayoutParams(MP,MP));
gridView.setNumColumns(4);
gridView.setOnItemClickListener(this);
gridView.setVisibility(View.INVISIBLE);
layout.addView(gridView);

//アプリ情報群の読み込み
appInfos=AppInfo.readAppInfos(this);
gridView.setAdapter(new GridAdapter());

//アプリ登録解除レシーバーの開始(3)
IntentFilter filter=
new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
filter.addDataScheme("package");
appReceiver=new AppReceiver();
registerReceiver(appReceiver,filter);
}

//グリッドアイテムのクリックイベント処理
public void onItemClick(AdapterView<?> parent,View v,int position,long id) {
try {
//アクティビティの起動
AppInfo appInfo=appInfos.get(position);
Intent intent=new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setComponent(new ComponentName(
appInfo.packageName,appInfo.className));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|
Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
startActivity(intent);
} catch (Exception e) {
}
}

//アクティビティ解放時に呼ばれる
@Override
public void onDestroy() {
super.onDestroy();

//アプリ登録解除レシーバーの解放
unregisterReceiver(appReceiver);
}

//バックキーの無効化
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getAction()==KeyEvent.ACTION_DOWN) {
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_BACK:
gridView.setVisibility(View.INVISIBLE);
return true;
}
}
return super.dispatchKeyEvent(event);
}

//グリッドアダプタの生成
public class GridAdapter extends BaseAdapter {
//要素数の取得
@Override
public int getCount() {
return appInfos.size();
}

//要素の取得
@Override
public Object getItem(int pos) {
return appInfos.get(pos);
}

//要素IDの取得
@Override
public long getItemId(int pos) {
return pos;
}

//ビューの取得
public View getView(int pos,View convertView,ViewGroup parent) {
Context context=HomeEx.this;
AppInfo appInfo=appInfos.get(pos);

//レイアウトの生成
if (convertView==null) {
//レイアウト
LinearLayout layout=new LinearLayout(context);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.TOP);
layout.setPadding(4,4,4,4);
convertView=layout;

//アイコン
ImageView imageView=new ImageView(context);
imageView.setTag("icon");
imageView.setLayoutParams(
new LinearLayout.LayoutParams(iconSize,iconSize));
layout.addView(imageView);

//テキストビュー
TextView textView=new TextView(context);
textView.setTag("name");
textView.setLines(2);
textView.setTextSize(12);
textView.setGravity(Gravity.CENTER_HORIZONTAL);
textView.setTextColor(Color.WHITE);
layout.addView(textView);
}

//値の指定
ImageView imageView=(ImageView)
convertView.findViewWithTag("icon");
imageView.setImageDrawable(appInfo.icon);
TextView textView=(TextView)
convertView.findViewWithTag("name");
textView.setText(appInfo.name);
return convertView;
}
}

//アプリ登録解除レシーバー
private class AppReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context,Intent intent) {
//アプリリストの読み込み
appInfos=AppInfo.readAppInfos(HomeEx.this);
gridView.setAdapter(new GridAdapter());
}
}

//オプションメニューの生成
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuItem item0=menu.add(0,0,0,"設定");
item0.setIcon(android.R.drawable.ic_menu_preferences);
MenuItem item1=menu.add(0,1,0,"壁紙");
item1.setIcon(android.R.drawable.ic_menu_gallery);
MenuItem item2=menu.add(0,2,0,"ランチャー");
item2.setIcon(android.R.drawable.ic_menu_today);
return true;
}

//オプションメニュー押下時に呼ばれる
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId=item.getItemId();
if (itemId==0) {
Intent intent=new Intent("android.settings.SETTINGS");
startActivity(intent);
} else if (itemId==1) {
//壁紙の変更
Intent intent=new Intent(Intent.ACTION_SET_WALLPAPER);
startActivity(Intent.createChooser(intent,"壁紙を選択"));
} else if (itemId==2) {
gridView.setVisibility(View.VISIBLE);
}
return true;
}
}

AppInfo.java
package net.npaka.homeex;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;

//アプリ情報
public class AppInfo {
public String name; //名前
public String packageName;//パッケージ名
public String className; //クラス名
public Drawable icon; //アイコン

//アプリ情報群の読み込み
public static ArrayList<AppInfo> readAppInfos(Context context) {
//アプリ情報郡の取得
PackageManager manager=context.getPackageManager();
Intent intent=new Intent(Intent.ACTION_MAIN,null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> apps=manager.queryIntentActivities(intent,0);
Collections.sort(apps,new ResolveInfo.DisplayNameComparator(manager));

//アプリ情報郡からの必要な情報の取得
ArrayList<AppInfo> appInfos=new ArrayList<AppInfo>();
if (apps==null) return appInfos;
for (int i=0;i<apps.size();i++) {
AppInfo appInfo=new AppInfo();
ResolveInfo info=apps.get(i);
appInfo.name=(String)info.loadLabel(manager);
appInfo.packageName=info.activityInfo.applicationInfo.packageName;
appInfo.className=info.activityInfo.name;
appInfo.icon=info.activityInfo.loadIcon(manager);
appInfos.add(appInfo);
}
return appInfos;
}
}

AndroidManifect.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.npaka.homeex"
android:versionCode="1"
android:versionName="1.0">

<uses-sdk android:minSdkVersion="13" android:targetSdkVersion="16" />

<application android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:theme="@style/Theme.Home"
android:launchMode="singleTask"
android:screenOrientation="portrait">
<activity
android:name=".HomeEx"
android:label="@string/app_name"
android:theme="@style/Theme.Home"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>

</manifest>

styles.xml
<resources>

<style name="Theme.Home" parent="android:style/Theme.Holo">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowShowWallpaper">true</item>
</style>

</resources>



−戻る−