在修改android图库源码的过程中,有一个需求是定制应用选择器,即style是定制的,不能用系统的。于是,花费了些时间,效果图如下:
主要思路如下:
1、自定义对话框,对话框视图设为view
2、view为一个vertical的线性布局,上面Wie一个文本,下面为一个ListView
3、ListView中的每一个item左边卫ImageView,右边为一个TextView。
代码如下
一、关键代码
package com.example.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class CustomListDialog extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom_list_dialog);
findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
createDialog(CustomListDialog.this, "content://media/external/images/media/108");
}
});
}
public void createDialog(Activity activity, final String imageUri){
final List<HashMap<String, Object>> appInfos = getShareApps(activity.getApplicationContext());
SimpleAdapter simpleAdapter = new SimpleAdapter(activity.getApplicationContext(),
appInfos,
R.layout.dialog_list_item,
new String[]{"appName"},
new int[]{R.id.appName}){
@Override
public View getView(
int position,
View convertView,
ViewGroup parent) {
View view = super.getView(position, convertView, parent);
ImageView appIcon = (ImageView)view.findViewById(R.id.appImage);
appIcon.setImageDrawable((Drawable)appInfos.get(position).get("appImage"));
return view;
}
};
View dialogView = activity.getLayoutInflater().inflate(R.layout.dialog_view, null);
ListView imageSetListView = (ListView)dialogView.findViewById(R.id.imageSetListView);
imageSetListView.setAdapter(simpleAdapter);
final Dialog dialog = new Dialog(this, R.style.dialog);
dialog.setContentView(dialogView);
dialog.setCanceledOnTouchOutside(true);
dialog.show();
imageSetListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
dialog.dismiss();
Intent wallpaperIntent = new Intent();
wallpaperIntent.setClassName(
appInfos.get(position).get("appPkgName").toString(),
appInfos.get(position).get("appLauncherClassName").toString());
wallpaperIntent.setDataAndType(Uri.parse(imageUri), "image/*");
startActivity(wallpaperIntent);
}
});
}
public List<HashMap<String, Object>> getShareApps(Context context) {
List<ResolveInfo> mApps = new ArrayList<ResolveInfo>();
Intent intent = new Intent(Intent.ACTION_ATTACH_DATA).addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setType("image/*");
PackageManager pManager = context.getPackageManager();
mApps = pManager.queryIntentActivities(intent,
PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
List<HashMap<String, Object>> appInfos = new ArrayList<HashMap<String, Object>>();
for (int i = 0; i < mApps.size(); i++) {
ResolveInfo resolveInfo=(ResolveInfo) mApps.get(i);
HashMap<String, Object> appInfo = new HashMap<String, Object>();
appInfo.put("appImage", resolveInfo.loadIcon(pManager));
appInfo.put("appName", resolveInfo.loadLabel(pManager).toString());
appInfo.put("appPkgName", resolveInfo.activityInfo.packageName);
appInfo.put("appLauncherClassName", resolveInfo.activityInfo.name);
appInfos.add(appInfo);
}
return appInfos;
}
}
二、xml布局文件
1、dialog_list_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp"
android:gravity="center_vertical"
android:orientation="horizontal" >
<ImageView
android:id="@+id/appImage"
android:layout_width="42dp"
android:layout_height="42dp"
android:layout_marginLeft="13dp"
android:layout_marginRight="13dp"/>
<TextView
android:id="@+id/appName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#333333"
android:textSize="16dp" />
</LinearLayout>
2、dialog_view.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="386dp"
android:layout_height="54dp"
android:background="@drawable/popup_title"
android:orientation="vertical" >
<TextView
android:layout_width="386dp"
android:layout_height="54dp"
android:alpha="0.75"
android:paddingLeft="13dp"
android:shadowColor="#ffffff"
android:gravity="center_vertical"
android:shadowRadius="1"
android:text="设置为"
android:textColor="#333333"
android:textSize="18sp" />
</LinearLayout>
<LinearLayout
android:layout_width="386dp"
android:layout_height="wrap_content"
android:background="@drawable/popup_list"
android:orientation="vertical" >
<ListView
android:id="@+id/imageSetListView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:dividerHeight="1dp"/>
</LinearLayout>
</LinearLayout>
3、styles.xml
<resources>
<style name="dialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:background">@android:color/transparent</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
</resources>