35、程序管理器--显示卸载、启动、分享的PopupWindow代码实现
来源:互联网 发布:主机销售网站源码 编辑:程序博客网 时间:2024/06/03 16:43
在AppManagerActivity中为listview设置item的点击事件:
lv_apps.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { //当用户点击下一个Item时,需要关闭已经存在的PopupWindow dismissPopupWindow(); //将布局文件转成view,该view用于显示PopupWindow中的内容 View contentView = View.inflate(getApplicationContext(),R.layout.popup_item, null); //分别获取到PopupWindow窗体中的"卸载、启动、分享"控件所对应的父控件 ll_uninstall = (LinearLayout) contentView.findViewById(R.id.ll_popup_uninstall); ll_start = (LinearLayout) contentView.findViewById(R.id.ll_popup_start); ll_share = (LinearLayout) contentView.findViewById(R.id.ll_popup_share); //获取用于显示PopupWindow内容的View的根布局,这里是要为该布局设置动画(相当于为PopupWindow设置动画) View ll_popup_container = contentView.findViewById(R.id.ll_popup_container); //为"卸载、启动、分享"设置点击事件 ll_share.setOnClickListener(AppManagerActivity.this); ll_start.setOnClickListener(AppManagerActivity.this); ll_uninstall.setOnClickListener(AppManagerActivity.this); //获取到当前Item的对象 Object obj = lv_apps.getItemAtPosition(i); //当Item为系统应用时,此时为PopupWindow中的"卸载"设置一个标记,在卸载时判断该标记,禁止卸载系统应用 if (obj instanceof AppInfo) { AppInfo appinfo = (AppInfo) obj; clickedpackname = appinfo.getPackname(); if (appinfo.isUserpp()) { ll_uninstall.setTag(true); } else { ll_uninstall.setTag(false); } } else { return; } //获取到当前Item离顶部、底部的距离 int top = view.getTop(); int bottom = view.getBottom(); //创建PopupWindow窗体时必须要指定窗体的大小,否则不会显示在界面上。参数一:窗体中用于显示内容的viewContent,参数二、三:表示PopupWindow窗体的宽和高 popupWindow = new PopupWindow(contentView, DensityUtil.dip2px(getApplicationContext(), 200), bottom - top + DensityUtil.dip2px(getApplicationContext(), 30)); // 注意:一定要给popwindow设置背景图片或背景资源,如果不设置背景资源 , 动画、 焦点的处理 都会产生问题。 popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); //获取到Item在窗体中显示的位置 int[] location = new int[2]; view.getLocationInWindow(location); //参数一:PopupWindow挂载在那个View上,参数二:设置PopupWindow显示的重心位置 //参数三:PopupWindow在View上X轴的偏移量,参数四:PopupWindow在View上Y轴的偏移量。X、Y轴的偏移量是相对于当前Activity所在的窗体,参照点为(0,0) popupWindow.showAtLocation(view, Gravity.TOP | Gravity.LEFT, location[0] + 20, location[1]); //设置一个缩放的动画效果 ScaleAnimation sa = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f); //设置动画执行的时间 sa.setDuration(300); // 播放一个缩放的动画. ll_popup_container.startAnimation(sa); } });单击item时,如果之前有弹出窗口则调用dismissPopupWindow关闭,将上文设计的布局文件转换为view,并获取相应控件。
为"卸载、启动、分享"设置点击事件,为父窗口的显示设置一个动画渐进效果,效果为从左上角300毫秒渐出。
getItemAtPosition获取listview所在位置的对象,如果是应用程序信息再判断是否是系统程序,因为系统程序不可卸载。
后面就是在指定的位置显示出PopupWindow。
dismissPopupWindow的实现:
private void dismissPopupWindow() { if (popupWindow != null && popupWindow.isShowing()) { popupWindow.dismiss(); popupWindow = null; } }在activity的onDestroy中也调用了dismissPopupWindow:
@Override protected void onDestroy() { dismissPopupWindow(); super.onDestroy(); }
另外点击listview的两个分组时,不应该弹出PopupWindow,可以设置这两个item为禁用的,重载BaseAdapter的isEnabled:
/** * 屏蔽掉两个TextView(用户程序和系统程序)被点击时的焦点 */ @Override public boolean isEnabled(int position) { if (position == 0 || position == (userappInfos.size() + 1)) { return false; } return super.isEnabled(position); }
当用户滑动窗体的时候,需要关闭已经存在的PopupWindow:
/** * 当用户滑动窗体的时候,需要关闭已经存在的PopupWindow */ lv_apps.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView absListView, int i) { } @Override public void onScroll(AbsListView absListView, int i, int i2, int i3) { dismissPopupWindow(); } });
其中用到的DensityUtil的代码:
package com.example.utils;import android.content.Context;public class DensityUtil { /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } /** * 根据手机的分辨率从 px(像素) 的单位 转成为 dp */ public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } }
0 0
- 35、程序管理器--显示卸载、启动、分享的PopupWindow代码实现
- 36、程序管理器--显示卸载、启动、分享的代码实现
- 34、程序管理器--显示卸载、启动、分享的PopupWindow界面设计
- 6.4 程序管理器中的应用启动&卸载&分享
- 程序的启动、卸载和分享
- Android源码--程序的分享、卸载、启动及详细信息
- 软件的分享、卸载、详细信息、运行的代码实现
- Android中实现卸载、启动、分享功能
- 【android开发】手机应用管理器的实现之实现对应用程序的运行、分享、卸载功能(三)
- 代码实现安装、卸载、分享软件
- 调用现有程序的接口(分享),发送和保存消息; 卸载程序的代码收藏
- 卸载,分享,启动
- 账号管理器的代码实现
- Android代码方式操作应用程序安装、卸载、分享、启动
- 卸载手机用户程序的代码
- fedora 自动启动的程序管理器
- 任务管理器功能,,运行的程序,卸载,结束任务
- android 分享功能,实现分享的程序与进行分享信息的代码
- <!DOCTYPE html>的内容讲解
- JBPM5 入门小例子
- Aspose.Cells简单用法
- LINUX ulimit命令
- 【python编程】网站密码暴力破解代码
- 35、程序管理器--显示卸载、启动、分享的PopupWindow代码实现
- 在Kentico CMS中使用jQuery集成图像缩放效果
- C++ effective—构造函数
- Qt Creator里面添加Python库
- javaSE-集合工具类-Collections
- 深入理解Linux内核(一)
- Android完美播放优酷视频
- maven学习笔记(3)--继承和聚合
- GestureDetector类及其用法