popupwindow
package cn.itcast.mobilesafe; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.ProgressDialog; import android.content.ComponentName; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout.LayoutParams; import android.widget.AbsListView; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.PopupWindow.OnDismissListener; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; public class AppManagerActivity extends Activity { protected static final int GET_APP_FINISHED = 80; protected static final String TAG = "AppManagerActivity"; ListView lv_appmanage; // 包管理器 获取安装的程序 PopupWindow mPopupWindow; PackageManager packageManager; List<ApplicationInfo> appInfos; List<ApplicationInfo> userAppInfos; ProgressDialog pd; LayoutInflater inflater; TextView tv_asset_title; boolean isAllapp = true; // 实例化一个动画效果的插入器 , 插入器是作用在某个view对象上的 Interpolator mInterpolator = new Interpolator() { public float getInterpolation(float input) { final float inner = (input * 1.55f) - 1.1f; return 1.2f - inner * inner; } }; Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); switch (msg.what) { case GET_APP_FINISHED: pd.dismiss(); getUserApp(); lv_appmanage.setAdapter(new AppListAdapter(appInfos)); break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.applationinstall); packageManager = getPackageManager(); inflater = LayoutInflater.from(this); pd = new ProgressDialog(this); pd.setMessage("正在搜索应用程序"); getInstallApp(); userAppInfos = new ArrayList<ApplicationInfo>(); tv_asset_title = (TextView) this.findViewById(R.id.asset_title); tv_asset_title.setOnClickListener(new OnClickListener() { public void onClick(View v) { if (isAllapp) { tv_asset_title.setText("用户程序"); isAllapp = false; lv_appmanage.setAdapter(new AppListAdapter(userAppInfos)); }else{ isAllapp = true; tv_asset_title.setText("所有程序"); lv_appmanage .setAdapter(new AppListAdapter(appInfos)); } } }); lv_appmanage = (ListView) this.findViewById(R.id.lv_appmanage); // 监听listview的滚动状态 lv_appmanage.setOnScrollListener(new OnScrollListener() { // 当滚动状态改变的回调方法 public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub dismissPopUpwindow(); } // listview滚动 的时候 会执行的回调方法 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // TODO Auto-generated method stub } }); lv_appmanage.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub // 用户点击某个item之前 判断 当前界面上是不是有popwindow dismissPopUpwindow(); // 要知道view在listview中的位置 showPopWindow(view, position); } }); } private void dismissPopUpwindow() { if (mPopupWindow != null && mPopupWindow.isShowing()) { mPopupWindow.dismiss(); mPopupWindow = null; } } private void getInstallApp() { pd.show(); new Thread() { @Override public void run() { // 获取到所有的安装的程序的信息 appInfos = packageManager .getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES); Message msg = new Message(); msg.what = GET_APP_FINISHED; handler.sendMessage(msg); } }.start(); } private void getUserApp(){ for (ApplicationInfo appinfo : appInfos) { if (filterApp(appinfo)) { userAppInfos.add(appinfo); } } } /* * 创建一个popupwindow 在指定的位置 参数view 是以那一个控件为 初始位置去显示 popupwindow */ public void showPopWindow(View view, int position) { int[] arrayOfInt = new int[2]; // 获取到 当前listview里面item 在窗体中显示的位置 view.getLocationInWindow(arrayOfInt); // 获取到popupwindow的布局 final View myview = inflater.inflate(R.layout.popup_item, null); ImageButton ib_share = (ImageButton) myview .findViewById(R.id.ib_popup_share); ImageButton ib_start = (ImageButton) myview .findViewById(R.id.ib_popup_start); ImageButton ib_uninstall = (ImageButton) myview .findViewById(R.id.ib_popup_uninstall); ib_share.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub Log.i(TAG, "当前popupwindow 对应item的 position" + (Integer) myview.getTag()); int posi = (Integer) myview.getTag(); ApplicationInfo appinfo; if (isAllapp){ appinfo = appInfos.get(posi); }else { appinfo= userAppInfos.get(posi); } String packname = appinfo.packageName; Intent localIntent1 = new Intent("android.intent.action.SEND"); localIntent1 = localIntent1.setType("text/plain"); localIntent1 = localIntent1.putExtra( "android.intent.extra.SUBJECT", "f分享"); localIntent1 = localIntent1.putExtra( "android.intent.extra.TEXT", "推荐你使用一款软件 名字为" + packname); localIntent1.createChooser(localIntent1, "分享"); startActivity(localIntent1); } }); ib_start.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub int posi = (Integer) myview.getTag(); ApplicationInfo appinfo; if (isAllapp){ appinfo = appInfos.get(posi); }else { appinfo= userAppInfos.get(posi); } String packname = appinfo.packageName; // Intent intent = new Intent(); // intent= packageManager.getLaunchIntentForPackage(packname); // <action android:name="android.intent.action.MAIN" /> // <category android:name="android.intent.category.LAUNCHER" /> // Intent i = new Intent(); // i.setAction("android.intent.action.MAIN"); // i.addCategory("android.intent.category.LAUNCHER"); // // List<ResolveInfo> lists = // packageManager.queryIntentActivities(i, // PackageManager.MATCH_DEFAULT_ONLY); // for(ResolveInfo list :lists){ // // } try { PackageInfo packinfo = packageManager.getPackageInfo( packname, PackageManager.GET_ACTIVITIES); ActivityInfo[] activityinfos = packinfo.activities; ActivityInfo lunchactivity = activityinfos[0]; Intent intent = new Intent(); intent.setComponent(new ComponentName(packname, lunchactivity.name)); startActivity(intent); } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } // if(intent==null){ // Toast.makeText(getApplicationContext(), "无法启动改应用", 1).show(); // return; // } // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // startActivity(intent); } }); ib_uninstall.setOnClickListener(new OnClickListener() { public void onClick(View v) { int posi = (Integer) myview.getTag(); ApplicationInfo appinfo; if (isAllapp){ appinfo = appInfos.get(posi); }else { appinfo= userAppInfos.get(posi); } String packname = appinfo.packageName; Intent intent = new Intent(); intent.setAction(Intent.ACTION_DELETE); Uri data = Uri.parse("package:" + packname); intent.setData(data); startActivity(intent); } }); // 把 position 设置给 myView 对象 myview.setTag(position); // 设置popupwindow显示的内容 mPopupWindow = new PopupWindow(myview, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); mPopupWindow.setFocusable(true); mPopupWindow.setOutsideTouchable(true); int i = arrayOfInt[0] + 60; int j = arrayOfInt[1]; // 设置popupwindow的动画效果 mPopupWindow.setAnimationStyle(R.anim.popup_enter); Animation anim = AnimationUtils.loadAnimation(this, R.anim.popup_enter); anim.setInterpolator(mInterpolator); anim.setDuration(1000); // 第一个参数 是popupwindow被挂载到哪个view对象上 // mPopupWindow.showAtLocation(view, 51, i, j); myview.startAnimation(anim); } /* * 绑定数据显示 */ public class AppListAdapter extends BaseAdapter { private List<ApplicationInfo> myappInfos; public AppListAdapter(List<ApplicationInfo> appInfos) { myappInfos = appInfos; } public int getCount() { // TODO Auto-generated method stub return myappInfos.size(); } public Object getItem(int position) { // TODO Auto-generated method stub return myappInfos.get(position); } public long getItemId(int position) { // TODO Auto-generated method stub return position; } public View getView(int position, View convertView, ViewGroup parent) { View view = null; if (convertView == null) { view = inflater.inflate(R.layout.applationinstall_item, null); } else { view = convertView; } ImageView iv = (ImageView) view.findViewById(R.id.lv_appicon); TextView tv = (TextView) view.findViewById(R.id.lv_appname); ApplicationInfo appinfo = myappInfos.get(position); // 获取appinfo的图标 Drawable icon = appinfo.loadIcon(packageManager); iv.setImageDrawable(icon); String appname = (String) appinfo.loadLabel(packageManager); tv.setText(appname); return view; } } public boolean filterApp(ApplicationInfo info) { // 系统的软件被升级后的程序 if ((info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) { // 用户安装的程序 替换掉了 系统的程序 return true; } else if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { // 用户自己安装的app return true; } return false; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if (event.getKeyCode()==KeyEvent.KEYCODE_BACK){ dismissPopUpwindow(); } return super.onKeyDown(keyCode, event); } }