实现定制桌面:
在App的主MainActivity里面获取系统所有App并且使用GridView显示出来
创建Android项目 5.1系统 项目名为:AndroidCusyomDesktopDemo
XML文件:
一.在MainActivity(使用线性布局,纵向)里创建一个GridView控件
< GridView
android:id="@+id/gv_mainshow"
android:numColumns="4"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
二.创建item界面,在里面添加一个ImageView以及TextView:
< ImageView
android:id=”@+id/gridiv_image_item”
android:layout_width=”100dp”
android:layout_height=”80dp”
android:src=”@drawable/jacket”
/>
TextView
android:id=”@+id/gridtv_text_item”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_below=”@+id/gridiv_image_item”
android:layout_centerInParent=”true”
android:text=”test”
/>
Java文件:
三.创建Grid对象以及存放item的List以及存放应用信息类型ResolveInfo的list
private List<ResolveInfo> rilist;//应用信息类型
private List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
private GridView gvmain;
四.在onCreate方法下实现init方法,init方法主要是把应用信息的list获取到,并把存放item的list填充满
private void init(){
Intent intent = new Intent(Intent.ACTION_MAIN,null); //应用程序最先启动的Activity
intent.addCategory(Intent.CATEGORY_LAUNCHER); //应用程序是否显示在程序列表里
rilist = getPackageManager().queryIntentActivities(intent,0); //得到应用信息列表
for (int i = 0;i<rilist.size();i++){
Map<String,Object> maps = new HashMap<String,Object>();
maps.put("itemImage",rilist.get(i).activityInfo.loadIcon(getPackageManager()));
maps.put("itemText",rilist.get(i).activityInfo.loadLabel(getPackageManager()));
list.add(maps);
}
}
五.获取GridView控件,并创建SimpleAdapter,并实现simpleAdapter.setViewBinder方法(这个方法主要用于检测图片是否被设置成功)
gvmain = (GridView) findViewById(R.id.gv_mainshow);
//参数 context,Data(存放的数据一般是list<Map<String,Objcet>> String也是可以int型),要显示的格局item,要显示格局里的控件的key,要显示格局里的控件id
SimpleAdapter simpleAdapter = new SimpleAdapter(
this,
list,
R.layout.grid_item,
new String[]{"itemImage","itemText"},
new int[]{R.id.gridiv_image_item,R.id.gridtv_text_item});
//如果不加这个图片判断,则会显示不出来图标
simpleAdapter.setViewBinder(new SimpleAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Object o, String s) {
if(view instanceof ImageView && o instanceof Drawable){ //判断得到的view是否为ImageView的子类和o是否为Drawble的子类
ImageView iv = (ImageView) view; //如果是,就把图片设置上,并返回true
iv.setImageDrawable((Drawable) o);
return true;
}
return false;
}
});
六.gvmain.setAdapter(),并设置OnItemClickListener Item监听
gvmain.setAdapter(simpleAdapter);
gvmain.setOnItemClickListener(listener);
七.创建AdapterView.OnItemClickListener 对象listener,实现其onItemClick方“`
private AdapterView.OnItemClickListener listener = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
ResolveInfo info = rilist.get(i); //得到被按下的item 应用
//get app's packageName
String packagename = info.activityInfo.packageName;
//get app's Class activity
String mainActivity = info.activityInfo.name;
//把获取到的信息封装到component里,然后使用Intent的setComponent,启动Intent
ComponentName component = new ComponentName(packagename,mainActivity);
Intent intent = new Intent();
intent.setComponent(component);
startActivity(intent);
}
};
效果图: