上一篇我们实现获取手机里面的所有应用程序的信息,并显示在列表中,今天我们主要利用popupWindow类实现一个对话框,对话框包括运行、分享、卸载、加锁。我们先看一下效果:
一、android的对话框的实现方式:
Android的对话框有两种:PopupWindow和AlertDialog。它们的不同点在于:
AlertDialog的位置固定,而PopupWindow的位置可以随意
AlertDialog是非阻塞线程的,而PopupWindow是阻塞线程的
PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;按照参照物的不同,可以分为相对于某个控件(Anchor锚)和相对于父控件。具体如下:
showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移
showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移。
二、PopupWindow对话框的实现:
首先我们要先建一个视图文件,用于存放四个控件,将这个view放到PopupWindow对象中
View popupView = View.inflate(MainActivity.this, R.layout.popup_item, null);
将view放到PopupWindow对象中:
popupWindow = new PopupWindow(popupView, 615, 150);
设置相关属性并将popupwindow显示出来:
Drawable drawable = new ColorDrawable(Color.TRANSPARENT);
popupWindow.setBackgroundDrawable(drawable);
int x = location[0]+60;
int y = location[1];
//把PopupWindow显示出来
popupWindow.showAtLocation(view, Gravity.LEFT | Gravity.TOP, x, y);
写一个方法用于判断popupwindow是否显示:
//判断PopupWindow是不是存在,存在就把它dismiss掉
private void dismissPopupWindow()
{
if(popupWindow != null)
{
popupWindow.dismiss();
popupWindow = null;
}
}
三、项目具体实现过程及代码:
新建一个视图文件存放控件popup_item.xml,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_app_popup"
android:layout_width="230dip"
android:layout_height="70dip"
android:background="@drawable/local_popup_bg"
android:gravity="center_vertical"
android:orientation="horizontal" >
<LinearLayout
android:id="@+id/ll_app_start"
android:layout_width="70dip"
android:layout_height="70dip"
android:gravity="center_horizontal|center_vertical"
android:orientation="vertical" >
<ImageView
android:layout_width="35dip"
android:layout_height="35dip"
android:scaleType="fitXY"
android:src="@drawable/img2"
android:contentDescription="@string/hello_world" />
<TextView
android:layout_width="35dip"
android:layout_height="20dip"
android:gravity="center_horizontal"
android:text="运行" />
</LinearLayout>
<View
android:layout_width="1dip"
android:layout_height="50dip"
android:background="#ff00ff66" />
<LinearLayout
android:id="@+id/ll_app_share"
android:layout_width="70dip"
android:layout_height="70dip"
android:gravity="center_horizontal|center_vertical"
android:orientation="vertical" >
<ImageView
android:layout_width="35dip"
android:layout_height="35dip"
android:scaleType="fitXY"
android:src="@drawable/img3"
android:contentDescription="@string/hello_world" />
<TextView
android:layout_width="35dip"
android:layout_height="20dip"
android:gravity="center_horizontal"
android:text="分享"/>
</LinearLayout>
<View
android:layout_width="1dip"
android:layout_height="50dip"
android:background="#ff00ff66" />
<LinearLayout
android:id="@+id/ll_app_lock"
android:layout_width="70dip"
android:layout_height="70dip"
android:gravity="center_horizontal|center_vertical"
android:orientation="vertical" >
<ImageView
android:id="@+id/iv_app_lock"
android:layout_width="35dip"
android:layout_height="35dip"
android:scaleType="fitXY"
android:src="@drawable/img4_lock"
android:contentDescription="@string/hello_world" />
<TextView
android:id="@+id/tv_app_lock"
android:layout_width="35dip"
android:layout_height="20dip"
android:gravity="center_horizontal"
android:text="加锁"/>
</LinearLayout>
<View
android:layout_width="1dip"
android:layout_height="50dip"
android:background="#ff00ff66" />
<LinearLayout
android:id="@+id/ll_app_uninstall"
android:layout_width="70dip"
android:layout_height="70dip"
android:layout_marginLeft="8dip"
android:gravity="center_horizontal|center_vertical"
android:orientation="vertical" >
<ImageView
android:layout_width="35dip"
android:layout_height="35dip"
android:scaleType="fitXY"
android:src="@drawable/img1"
android:contentDescription="@string/hello_world" />
<TextView
android:layout_width="35dip"
android:layout_height="20dip"
android:text="卸载" />
</LinearLayout>
</LinearLayout>
在MainActivity类中添加代码,如下:
package com.xh.ui;
import java.util.List;
import com.example.appmanager.R;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.ScaleAnimation;
import android.view.ViewGroup;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
/**
* 类名称:MainActivity
* 类描述:系统主页面
* 创建人:LXH
* 创建时间:2013-11-5 下午3:31:00
*/
public class MainActivity extends Activity implements OnClickListener{
private static final int GET_ALL_APP_FINISH = 1;
private ListView lv_app_manager;//应用信息列表
private LinearLayout ll_app_manager_progress; //进度条
private AppInfoProvider provider;
private AppManagerAdapter adapter;
private List<AppInfo> list;
private PopupWindow popupWindow;
@SuppressLint("HandlerLeak")
private Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
switch(msg.what)
{
case GET_ALL_APP_FINISH :
//进度条设置为不可见
ll_app_manager_progress.setVisibility(View.GONE);
adapter = new AppManagerAdapter();
lv_app_manager.setAdapter(adapter);
break;
default :
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
lv_app_manager = (ListView) findViewById(R.id.lv_app_manager);
ll_app_manager_progress = (LinearLayout) findViewById(R.id.ll_app_manager_progress);
ll_app_manager_progress.setVisibility(View.VISIBLE);
/**
* 开一个线程用于完成对所有应用程序信息的搜索
* 当搜索完成之后,就把一个成功的消息发送给Handler,
* 然后handler把搜索到的数据设置进入listview里面 .
* */
new Thread()
{
public void run()
{
provider = new AppInfoProvider(MainActivity.this);
list = provider.getAllApps();
Message msg = new Message();
msg.what = GET_ALL_APP_FINISH;
handler.sendMessage(msg);
};
}.start();
//实现点击listview触发事件
lv_app_manager.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// TODO Auto-generated method stub
dismissPopupWindow();
//用来存放当前的item的坐标值,第一个是x的坐标,第二个是y的坐标
int[] location = new int[2];
//把当前的item的坐标值放到int数组里面
view.getLocationInWindow(location);
View popupView = View.inflate(MainActivity.this, R.layout.popup_item, null);
//new 一个PopupWindow出来
popupWindow = new PopupWindow(popupView, 615, 150);
//一定要给PopupWindow设置一个背景图片,不然的话,会有很多未知的问题的
//如没办法给它加上动画,还有显示会有问题等,
//如果我们没有要设置的图片,那么我们就给它加上了一个透明的背景图片
Drawable drawable = new ColorDrawable(Color.TRANSPARENT);
popupWindow.setBackgroundDrawable(drawable);
int x = location[0]+60;
int y = location[1];
//把PopupWindow显示出来
popupWindow.showAtLocation(view, Gravity.LEFT | Gravity.TOP, x, y);
//增加一个动画效果
LinearLayout ll_app_popup = (LinearLayout) popupView.findViewById(R.id.ll_app_popup);
ScaleAnimation scaleAnimation = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f);
scaleAnimation.setDuration(300);
ll_app_popup.startAnimation(scaleAnimation);
}
});
//listview滚动时判断一下对话框,防止对话框一直存在
lv_app_manager.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView arg0, int arg1) {
// TODO Auto-generated method stub
dismissPopupWindow();
}
@Override
public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
dismissPopupWindow();
}
});
}
//判断PopupWindow是不是存在,存在就把它dismiss掉
private void dismissPopupWindow()
{
if(popupWindow != null)
{
popupWindow.dismiss();
popupWindow = null;
}
}
//======================================================================
private class AppManagerAdapter extends BaseAdapter
{
@Override
public int getCount()
{
return list.size();
}
@Override
public Object getItem(int position)
{
return list.get(position);
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
AppInfo info = list.get(position);
if(convertView == null)
{
View view = View.inflate(MainActivity.this, R.layout.app_manager_item, null);
AppManagerViews views = new AppManagerViews();
views.iv_app_icon = (ImageView) view.findViewById(R.id.iv_app_manager_icon);
views.tv_app_name = (TextView) view.findViewById(R.id.tv_app_manager_name);
views.iv_app_icon.setImageDrawable(info.getIcon());
views.tv_app_name.setText(info.getAppName());
view.setTag(views);
return view;
}
else
{
AppManagerViews views = (AppManagerViews) convertView.getTag();
views.iv_app_icon.setImageDrawable(info.getIcon());
views.tv_app_name.setText(info.getAppName());
return convertView;
}
}
}
/**
* 用来优化listview的类
* */
private class AppManagerViews
{
ImageView iv_app_icon;
TextView tv_app_name;
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
}
}
运行后效果就会出来了!到此,利用popupwindow类实现的对话框就结束了,过程应该说是相当的简单,需要说明在代码中也加了注释。大家可以下载源码详细参考一下,实例代码本人运行都是正常的。有什么问题,大家请在下面留言说明,大家在一起交流。下一篇我们将实现运行、分享、卸载功能,欢迎大家继续关注!