Android平台手机UI应用开发——软件管理器

第一次写博客,与大家分享源代码,博客很多地方不知道怎么设计,望见谅。

希望大家多多支持,雅林和大家一起学习Android,共同进步。

今天我们要做的这个软件管理器,主要目的是为了学习Android平台手机UI设计。

 

源代码下载地址:Android平台手机UI应用开发——软件管理器

 

功能:

在应用上分为:系统应用用户应用

在界面上实现应用列表的两种视图:列表视图网格视图

在功能上实现应用的启动详细信息卸载功能。

以及底部菜单的美化

 

截图:

 

 

 

 

 

 

项目目录:

 

XML代码展示:

 layout目录文件

about.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:background="@drawable/bg"
  android:orientation="vertical">
  <TextView
  	android:layout_width="fill_parent"
  	android:layout_height="wrap_content"
  	android:textSize="20px"
  	android:textStyle="bold"
  	android:textColor="#FFFFFF"
  	android:text="关于SoftManager说明"/>
  <TextView
  	android:layout_width="fill_parent"
  	android:layout_height="wrap_content"
  	android:text="感谢您使用SoftManager,SoftManager是一个可以管理手机应用的一款绿色软件,使用户可以对自己手机软件有一个直观的了解。本应用提供两种视图方式(网格视图和列表视图),用户可以根据自己的需求随意调换。"/>
  <TextView
  	android:layout_width="fill_parent"
  	android:layout_height="wrap_content"
  	android:text="功能列表:"
  	android:textSize="20px"
  	android:textStyle="bold"
  	android:textColor="#FFFFFF"/>
  <TextView
  	android:layout_width="fill_parent"
  	android:layout_height="wrap_content"
  	android:text="①SoftManager可以执行手机应用程序"
  	android:textSize="16px"
  	android:textStyle="bold"
  	android:textColor="#FFFFFF"/>
  <TextView
  	android:layout_width="fill_parent"
  	android:layout_height="wrap_content"
  	android:text="②SoftManager可以对查看应用相关信息(包括如下信息)"
  	android:textSize="16px"
  	android:textStyle="bold"
  	android:textColor="#FFFFFF"/>
  <TextView
  	android:layout_width="fill_parent"
  	android:layout_height="wrap_content"
  	android:text="程序名称"/>
  <TextView
  	android:layout_width="fill_parent"
  	android:layout_height="wrap_content"
  	android:text="程序包名"/>
  <TextView
  	android:layout_width="fill_parent"
  	android:layout_height="wrap_content"
  	android:text="程序版本"/>
  <TextView
  	android:layout_width="fill_parent"
  	android:layout_height="wrap_content"
  	android:text="程序版本号"/>
  <TextView
  	android:layout_width="fill_parent"
  	android:layout_height="wrap_content"
  	android:text="③SoftManager可以卸载手机应用"
  	android:textSize="16px"
  	android:textStyle="bold"
  	android:textColor="#FFFFFF"/>	
  	
</LinearLayout>

 

gridview_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
	android:id="@+id/gvmenu" 
	android:layout_width="fill_parent" 
	android:layout_height="wrap_content"
	android:layout_alignParentBottom="true"
	android:stretchMode="columnWidth" 
	android:numColumns="4"
	android:listSelector="@drawable/menu_selectitem"
	android:horizontalSpacing="12.0dip" 
	android:verticalSpacing="8.0dip">
</GridView>


gridviewitem.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="90px"
  android:layout_height="wrap_content"
  android:orientation="vertical"
  android:gravity="center_horizontal">
  <ImageView
  	android:id="@+id/gv_item_icon"
  	android:paddingTop="3px"
  	android:layout_width="55px"
  	android:layout_height="55px"/>
  <TextView
  	android:id="@+id/gv_item_appname"
  	android:layout_width="60px"
  	android:layout_height="wrap_content"
  	android:textSize="13px"
  	android:maxLines="1"
  	android:gravity="center"
  	android:textColor="#FFFFFF"
  	android:paddingBottom="3px"/>
</LinearLayout>


huanyingmian.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@drawable/huanying">
</LinearLayout>


listviewitem.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
  android:gravity="center_vertical">
  <ImageView
      android:id="@+id/lv_icon"
      android:layout_marginTop="5px"
      android:layout_marginBottom="5px"
      android:layout_width="48px"
      android:layout_height="48px"/>
  <LinearLayout 
      android:orientation="vertical"
      android:layout_marginLeft="5px"
      android:layout_width="wrap_content"
      android:layout_height="48px">
      <TextView 
          android:id="@+id/lv_item_appname"
          android:maxLines="1"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:textSize="16px"
          android:textColor="#ffffff"/>
      <TextView 
          android:id="@+id/lv_item_packagename"
          android:maxLines="1"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:textColor="#ffffff"/>
  </LinearLayout>
</LinearLayout>


main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:background="@drawable/bg"
  android:id="@+id/mianxmllay"
  android:orientation="vertical">
  <RelativeLayout
  	android:layout_width="fill_parent"
  	android:layout_height="30px"
  	android:background="@drawable/top_bg">
  	<ImageView
 	android:id="@+id/top_icon"
  	android:layout_width="135px"
  	android:layout_height="30px"
  	android:src="@drawable/top_icon"/>
  </RelativeLayout>
  <LinearLayout
  	android:layout_height="wrap_content"
  	android:layout_width="fill_parent"
  	android:orientation="vertical">
  	<LinearLayout
  		android:layout_width="fill_parent"
  		android:layout_height="30px"
  		android:id="@+id/top_gg_lay"
  		android:background="@drawable/to_gg_bg">
  		<TextView
  			android:id="@+id/top_gg_text"
  			android:layout_width="wrap_content"
  			android:layout_height="30px"
  			android:textColor="#FF0000"
  			android:textSize="16px"
  			android:gravity="center_vertical"
  			android:text="官方公告:"/>
  		<TextView
  			android:id="@+id/top_text"
  			android:layout_width="wrap_content"
  			android:layout_height="30px"
  			android:gravity="center_vertical"
  			android:layout_toRightOf="@id/top_gg_text"
  			android:singleLine="true"
  			android:scrollHorizontally="true"
  			android:focusable="true"
  			android:ellipsize="marquee"
  			android:marqueeRepeatLimit="marquee_forever"
  			android:textColor="#000000"
  			android:text="欢迎使用软件管理器,我们一直为能更好的管理您的软件而努力。"/>	
  	</LinearLayout>
  	<RelativeLayout
	  android:layout_width="fill_parent"
	  android:layout_height="40px"
	  android:background="#FFFFFF"
	  android:layout_alignParentBottom="true"
	  android:gravity="center_vertical|center_horizontal"
	  android:id="@+id/qiehuan_relative">
	  <ImageButton
	  	android:id="@+id/ib_ch_view"
	  	android:layout_alignParentLeft="true"
	  	android:layout_marginLeft="5px"
	  	android:background="@drawable/top_left_list"
	  	android:layout_width="wrap_content"
	  	android:layout_height="wrap_content"/>
	  <ImageButton
	  	android:id="@+id/btn_jiantou"
	  	android:layout_height="30px"
	  	android:layout_width="50px"
	  	android:background="@drawable/jiantou"
	  	android:layout_centerHorizontal="true"
	  	/>	
	  <ImageButton
	  	android:id="@+id/ib_ch_categroy"
	  	android:layout_alignParentRight="true"
	  	android:layout_marginRight="5px"
	  	android:background="@drawable/top_right_user"
	  	android:layout_width="wrap_content"
	  	android:layout_height="wrap_content"/>
	</RelativeLayout>
	<LinearLayout
	android:layout_width="fill_parent"
	android:layout_height="fill_parent">
		<GridView
	  	android:id="@+id/gridView"
	  	android:layout_width="fill_parent"
	  	android:layout_height="fill_parent"
	  	android:numColumns="3"
	  	android:horizontalSpacing="10px"
	  	android:verticalSpacing="10px"
	  	android:listSelector="@drawable/choose_gridview"
	  	android:layout_marginRight="5px"
	  	android:layout_marginTop="5px"
	  	android:layout_marginLeft="5px"/>
	  	<ListView
	  	android:id="@+id/lv_apps"
	  	android:layout_width="fill_parent"
	  	android:layout_height="fill_parent"
	  	android:listSelector="@drawable/choose_listview"
	  	android:layout_marginLeft="5px"
	  	android:layout_marginRight="5px"
	  	android:layout_marginTop="5px"
	  	android:visibility="gone"/>
	</LinearLayout>
  </LinearLayout>		
</LinearLayout>

 

menu_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/RelativeLayout_Item"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:paddingTop="6.0dip"
  android:saveEnabled="false"
  android:orientation="vertical"
  android:gravity="center_horizontal">
  <ImageView
  	android:id="@+id/item_image"
  	android:layout_width="wrap_content"
  	android:layout_height="wrap_content"
  />
  <TextView 
  	android:id="@+id/item_text" 
  	android:layout_width="wrap_content"
	android:layout_height="wrap_content" 
	android:layout_marginTop="7.0dip"
	android:textColor="#42556B"
   />
</LinearLayout>


topmenu.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="40px"
  android:background="#FFFFFF"
  android:gravity="center_vertical">
  <ImageButton
  	android:id="@+id/ib_ch_view"
  	android:layout_alignParentLeft="true"
  	android:layout_marginLeft="5px"
  	android:background="@drawable/top_left_list"
  	android:layout_width="wrap_content"
  	android:layout_height="wrap_content"
  	/>
	
  <ImageButton
  	android:id="@+id/ib_ch_categroy"
  	android:layout_alignParentRight="true"
  	android:layout_marginRight="5px"
  	android:background="@drawable/top_right_user"
  	android:layout_width="wrap_content"
  	android:layout_height="wrap_content"/>
</RelativeLayout>


values目录文件

arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<array name="choice">
		<item name="start">启动程序</item>
		<item name="detail">详细信息</item>
		<item name="uninstall">卸载程序</item>
	</array>
</resources>


colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="discuss_blue">#295782</color>
<color name="white">#FFFFFF</color>
<color name="black">#000000</color>
<color name="discuss_writer">#778190</color>
<color name="gray">#ff888888</color>
<color name="photo_preview_select_album_layout_bg">#ff3a3a3a</color>
</resources>


strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, MainViewActivity!</string>
    <string name="app_name">软件管理器</string>
</resources>


styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="menuTextStyle" parent="@android:style/TextAppearance.Small">
        <item name="android:textSize">12.0sp</item>
        <item name="android:textColor">@color/menu_text_color</item>
    </style>
    <style name="menushow">
        <item name="android:windowEnterAnimation">@anim/menu_in</item>
        <item name="android:windowExitAnimation">@anim/menu_out</item>
    </style>
</resources>

 

anim目录文件

menu_in.xml

<?xml version="1.0" encoding="UTF-8"?>
<set android:interpolator="@android:anim/decelerate_interpolator"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:duration="@android:integer/config_shortAnimTime" android:fromYDelta="25.0%" android:toYDelta="0.0" />
    <alpha android:duration="@android:integer/config_shortAnimTime" android:fromAlpha="0.0" android:toAlpha="1.0" />
</set>


menu_out.xml

<?xml version="1.0" encoding="UTF-8"?>
<set android:interpolator="@android:anim/accelerate_interpolator"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:duration="@android:integer/config_shortAnimTime" android:fromYDelta="0.0" android:toYDelta="50.0%" />
    <alpha android:duration="@android:integer/config_shortAnimTime" android:fromAlpha="1.0" android:toAlpha="0.0" />
</set>


color目录文件

menu_text_color.xml

<?xml version="1.0" encoding="UTF-8"?>
<selector
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true" android:color="#ff031e3a" />
    <item android:state_enabled="false" android:color="#ff778797" />
</selector>



AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.feioh"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".HuanyingActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainViewActivty"/>
        <activity android:name=".About"/>

    </application>
</manifest>


JAVA代码展示

com.feioh包

About.java

package com.feioh;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
/**
 * 关于软件
 * @author yalin
 *
 */
public class About extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		//让title不显示
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		//全屏显示
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		setContentView(R.layout.about);
	}
}


GridViewAdapter.java

package com.feioh;

import java.util.List;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
/**
 * GridViewAdapter 软件管理GridView视图的自定义Adapter
 * @author 雅林
 *
 */
public class GridViewAdapter extends BaseAdapter {
	private List<PackageInfo> packageInfos=null;
	private LayoutInflater inflater=null;
	private Context context=null;
	
	//构造函数,接收数据
	public GridViewAdapter(List<PackageInfo> packageInfos,Context context)
	{
		this.packageInfos=packageInfos;
		this.context=context;
		//新方法,inflater对象的作用是将xml文件转换成视图
		inflater=LayoutInflater.from(context);
	}
	
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return packageInfos.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return packageInfos.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		convertView =inflater.inflate(R.layout.gridviewitem,null);
		TextView tv=(TextView) convertView.findViewById(R.id.gv_item_appname);
		ImageView iv=(ImageView) convertView.findViewById(R.id.gv_item_icon);
		
		//得到软件的名称并设置
		tv.setText(packageInfos.get(position).applicationInfo.loadLabel(context.getPackageManager()));
		//得到软件的图标并设置
		iv.setImageDrawable(packageInfos.get(position).applicationInfo.loadIcon(context.getPackageManager()));
		return convertView;
	}

}


HuanyingActivity.java

package com.feioh;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

/**
 * 欢迎界面
 * @author yalin
 *
 */
public class HuanyingActivity extends Activity implements Runnable{
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
	 //让title不显示
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    //全屏显示
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    		WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
    setContentView(R.layout.huanyingmian);
    
    //在每一个Activity的onCreate方法中添加Activity到MyApplication对象实例容器中
    MyApplication.getInstance().addActivity(this);
    
    //新开辟一个线程
    Thread thread=new Thread(this);
	thread.start();
	}

	@Override
	public void run() {
		//线程休息两秒秒钟
		try{
			Thread.sleep(3000);
		}catch (Exception e) {
			e.printStackTrace();
		}
		//跳转到程序页面
		Intent intent=new Intent(HuanyingActivity.this,MainViewActivty.class);
		startActivity(intent);
		//此Activity不在起作用
		finish();
	}
	
	
}


ListViewAdapter.java

package com.feioh;

import java.util.List;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
/**
 * ListViewAdapter 软件管理ListView视图的自定义Adapter
 * @author 雅林
 *
 */
public class ListViewAdapter extends BaseAdapter {
	private List<PackageInfo> packageInfos=null;
	private Context context=null;
	private LayoutInflater inflater=null;
	
	//构造方法
	public ListViewAdapter(List<PackageInfo> packageInfos,Context context)
	{
		this.packageInfos=packageInfos;
		this.context=context;
		//新方法,inflater对象的作用是将xml文件转换成视图
		inflater=LayoutInflater.from(context);
	}
	
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return packageInfos.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return packageInfos.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		convertView =inflater.inflate(R.layout.listviewitem,null);
		
		ImageView iv=(ImageView) convertView.findViewById(R.id.lv_icon);
		TextView tv1=(TextView) convertView.findViewById(R.id.lv_item_appname);
		//加粗
		tv1.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
		
		TextView tv2=(TextView) convertView.findViewById(R.id.lv_item_packagename);
		
		//得到软件的图标并设置
		iv.setImageDrawable(packageInfos.get(position).applicationInfo.loadIcon(context.getPackageManager()));
		//得到软件的名称并设置
		tv1.setText(packageInfos.get(position).applicationInfo.loadLabel(context.getPackageManager()));
		//得到软件的全包名并设置
		tv2.setText(packageInfos.get(position).packageName);
		return convertView;
	}

}


MainViewActivity.java

package com.feioh;


import java.util.ArrayList;
import java.util.List;

import android.R.color;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.ProgressDialog;
import android.content.ComponentName;
import android.content.DialogInterface;
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.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.Toast;

public class MainViewActivty extends Activity implements Runnable {
    private GridView gridView=null;
    private ListView listView=null;
    
    private List<PackageInfo> packageInfos=null;//用来去的系统中的所有包的信息
    private List<PackageInfo> userPackageInfos=null;//用户自己安装的程序
    private List<PackageInfo> showPackageInfos=null;//当前显示的安装程序
    
    private ImageButton changeViewBtn=null;//切换List 和 Grid视图
    private ImageButton changeCategoryBtn=null;//切换用户应用和切换系统应用按钮
    
    private boolean isUserApp=true;//用来实现系统应用与自己应用的切换
    private boolean isListView=true;//用来listview,gridview的切换
    
    private final int SEARCH_APP=0;//线程请求
    private ProgressDialog dialog=null;//进度条对话框
	
	private int selTitle=0;//底部菜单标题选项ID
	
	private PopupWindow popup;//定义popupwindow
	private MenuAdapter menuAdapter;//定义菜单GridView适配器
	private List<MenuInfo> menulists;//菜单项列表
	private GridView menuGridView;//定义菜单GridView
    
	private boolean isJt=true;//控制小箭头
	private ImageButton btn=null;//定义小箭头图标
    
    private Handler handler=new Handler(){
    	//当消息发送过来的时候会执行下面这个方法
    	public void handleMessage(android.os.Message msg){
    		super.handleMessage(msg);
    		if(msg.what==SEARCH_APP){
    			showPackageInfos = packageInfos;
    		gridView.setAdapter(new GridViewAdapter(showPackageInfos, 
    				MainViewActivty.this));
    		listView.setAdapter(new ListViewAdapter(showPackageInfos,
    				MainViewActivty.this));
    		dialog.dismiss();//让dialog消失
    		}
    	};
    };
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //让title不显示
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        //全屏显示
//        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
//        		WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.main);
        
        //得到小箭头,点击小箭头
        btn=(ImageButton) findViewById(R.id.btn_jiantou);
        btn.setOnClickListener(new OnClickListener() {
        	//得到广告视图
			LinearLayout linear=(LinearLayout) findViewById(R.id.top_gg_lay);
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if(isJt)
				{
					linear.setVisibility(View.GONE);
					btn.setBackgroundResource(R.drawable.jiantouxia);
					isJt=false;
					
				}else
				{
					linear.setVisibility(View.VISIBLE);
					btn.setBackgroundResource(R.drawable.jiantou);
					isJt=true;
				}
			}
		});
        
        
        
        //初始化底部菜单
        initPopuWindows();
        
        //分别得到listView和gridView视图
        listView=(ListView) findViewById(R.id.lv_apps);
        gridView=(GridView) findViewById(R.id.gridView);
        
        //显示dialog,正在搜索。。。
        dialog = ProgressDialog.show(this, "Waiting please ....", "正在搜索所安装的应用程序",true,false);
        
        //得到切换视图按钮
        changeViewBtn=(ImageButton) findViewById(R.id.ib_ch_view);
        changeViewBtn.setOnClickListener(topClick);
        //得到切换程序按钮
        changeCategoryBtn=(ImageButton) findViewById(R.id.ib_ch_categroy);
        changeCategoryBtn.setOnClickListener(topClick);
        
        
		gridView.setOnItemClickListener(listener);
		listView.setOnItemClickListener(listener);
		
		//开辟一个线程
		Thread thread=new Thread(this);
		thread.start();
		
		//在每一个Activity的onCreate方法中添加Activity到MyApplication对象实例容器中
	    MyApplication.getInstance().addActivity(this);
    }
    
    //应用程序执行事件
    OnItemClickListener listener=new OnItemClickListener() {
    	@Override
    	public void onItemClick(AdapterView<?> parent, View view, int position,
    			long id) {
    		//通过positon取出对应的packageInfo
    		final PackageInfo packageInfo=showPackageInfos.get(position);
    		//创建一个Dialog用来进行选择
    		AlertDialog.Builder builder=
    				new AlertDialog.Builder(MainViewActivty.this);
    		builder.setTitle("选项");
    		//接受一个资源的ID
    		builder.setItems(R.array.choice,new DialogInterface.OnClickListener() {
						@Override
						public void onClick(DialogInterface dialog, int which) {
							// 这里面用来写单击对话框各项时候的事件处理
							switch (which) {
							case 0:
								String packageName=packageInfo.packageName;
								ActivityInfo activityInfo=
										packageInfo.activities[0];
								if(activityInfo==null){
									Toast.makeText(MainViewActivty.this
											, "没有任何activity", 
											Toast.LENGTH_SHORT).show();
									return;
								}
								String activityName=activityInfo.name;
								Intent intent=new Intent();
								//通过报名和类名来启动应用程序
								intent.setComponent(new ComponentName(packageName,activityName));
								startActivity(intent);
								break;
							case 1:
								Builder builder=new Builder(MainViewActivty.this);
								builder.setTitle("详细信息");
								builder.setIcon(packageInfo.activities[0].icon);
								builder.setPositiveButton("确定", null);
								builder.setMessage("程序名称:"+packageInfo.activities[0].name+"\n"+
								"包名:"+packageInfo.packageName+"\n"+"版本号:"+packageInfo.versionCode
								+"\n"+"版本名:"+packageInfo.versionName);
								builder.show();
								break;
							case 2:
								Uri packageUri=Uri.parse("package:"+packageInfo.packageName);
								Intent deleteIntent=new Intent();
								deleteIntent.setAction(Intent.ACTION_DELETE);
								deleteIntent.setData(packageUri);
								//这句话是为了解决删除完应用后,程序图标仍然存在的bug
								startActivityForResult(deleteIntent, 0);
								break;
							}
						}
					});
    		//此处设为null,即默认就实现了关闭功能
    		builder.setNegativeButton("取消", null);
    		builder.create().show();
    	}
	};
    
	
	//头部菜单点击事件
	OnClickListener topClick=new OnClickListener() {
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			//如果点击的是 头部菜单左边按钮
			if(v.getId()==R.id.ib_ch_view)
			{
				//让GridView 消失,让ListView显示
				if(isListView==true){
					listView.setVisibility(View.VISIBLE);
					gridView.setVisibility(View.GONE);
					isListView=false;
					
					v.setBackgroundResource(R.drawable.top_left_grid);
				}else{
				//让ListView消失,让GridView显示	
					listView.setVisibility(View.GONE);
					gridView.setVisibility(View.VISIBLE);
					isListView=true;
					v.setBackgroundResource(R.drawable.top_left_list);
				}
			}
			//如果点击的头部菜单是  右边按钮
			if(v.getId()==R.id.ib_ch_categroy)
			{
				//把用户应用 作为要显示的应用
				if(isUserApp){
					v.setBackgroundResource(R.drawable.top_right_all);
					showPackageInfos=userPackageInfos;
					isUserApp=false;
				}
				else{
				//把系统应用作为要显示的应用	
					v.setBackgroundResource(R.drawable.top_right_user);
					showPackageInfos=packageInfos;
					isUserApp=true;
				}
				//为listView和gridView设置适配器
				gridView.setAdapter(new GridViewAdapter(showPackageInfos,MainViewActivty.this));
	    		listView.setAdapter(new ListViewAdapter(showPackageInfos,MainViewActivty.this));
			}
		}
	};
    
	//重写菜单按钮时  必须要重写的方法
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {// 创建MENU
		menu.add("menu");// 必须创建一项
		return super.onCreateOptionsMenu(menu);
	}
	//重写菜单按钮
	@Override
	public boolean onMenuOpened(int featureId, Menu menu) {
		// TODO Auto-generated method stub
		if (popup != null) {
			//得到所有菜单项列表
   			menulists = MenuUtils.getMenuList();
   			//为适配器设置数据(list<MenuInfo>)
   			menuAdapter = new MenuAdapter(this, menulists);
   			//为GridView填充数据
   			menuGridView.setAdapter(menuAdapter);
   			//显示popup
   			popup.showAtLocation(this.findViewById(R.id.mianxmllay), Gravity.BOTTOM, 0, 0);
   		}
		return false;
	}
	
	 //这个新开辟的线程 主要用来获取系统应用所有包 和 用户应用所有包
    @Override
    public void run() {
    	System.out.println(Thread.currentThread().getName());
    	//获得系统中所有包
    	packageInfos=getPackageManager().getInstalledPackages(
    			PackageManager.GET_UNINSTALLED_PACKAGES|PackageManager.GET_ACTIVITIES);
    	//实例化用户自己安装的程序
    	userPackageInfos=new ArrayList<PackageInfo>();
    	for (PackageInfo temp:packageInfos) {
			boolean flag=false;
			ApplicationInfo appInfo=temp.applicationInfo;
			if((appInfo.flags&ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)!=0){
				//更新过的系统应用程序
				flag=true;
			}else if((appInfo.flags&ApplicationInfo.FLAG_SYSTEM)==0){
				//用户自己的应用程序
				flag=true;
			}
			if(flag){
				userPackageInfos.add(temp);
			}
		}
    	//发送一个信息给主线程,让主线程把progressDialog给取消掉
    	handler.sendEmptyMessage(SEARCH_APP);
    }
	
    //设置PopupWindows
    private void initPopuWindows()
    {
    	//初始化GridView
    	menuGridView=(GridView) View.inflate(this,R.layout.gridview_menu,null);
    	//初始化PopupWindow,LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT控制显示
    	popup=new PopupWindow(menuGridView,LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
    	// 设置menu菜单背景
    	popup.setBackgroundDrawable(getResources().getDrawable(R.drawable.menu_background));
    	// menu菜单获得焦点 如果没有获得焦点menu菜单中的控件事件无法响应
    	popup.setFocusable(true);
    	//设置显示和隐藏的动画
    	popup.setAnimationStyle(R.style.menushow);
    	popup.update();
    	//设置触摸获取焦点
    	menuGridView.setFocusableInTouchMode(true);
    	//设置键盘事件,如果按下菜单键则隐藏菜单
    	menuGridView.setOnKeyListener(new android.view.View.OnKeyListener() {
    	public boolean onKey(View v, int keyCode, KeyEvent event) {
    		if ((keyCode == KeyEvent.KEYCODE_MENU) && (popup.isShowing())) {
    			popup.dismiss();  
    				return true;
    		}else{
    			return false;
    		}
    	}

    	});
    	//添加菜单按钮事件
    	menuGridView.setOnItemClickListener(new OnItemClickListener() {
    		public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
    			// TODO Auto-generated method stub
    			MenuInfo mInfo = menulists.get(position);
    			popup.dismiss();
    			if (mInfo.ishide) {
    				return;
    			}
    			switch (mInfo.menuId) {
    			case MenuUtils.MENU_LIEBIAO:
    				//以List列表显示
    				listView.setVisibility(View.VISIBLE);
    				gridView.setVisibility(View.GONE);
    				isListView=false;
    				break;
    			case MenuUtils.MENU_WANGGE:
    				//以网格列表显示
    				listView.setVisibility(View.GONE);
    				gridView.setVisibility(View.VISIBLE);
    				isListView=true;
    				break;
    			case MenuUtils.MENU_USERAPP:
    				//显示用户应用
    				showPackageInfos=userPackageInfos;
    				isUserApp=false;
    				//为listView和gridView设置适配器
    				gridView.setAdapter(new GridViewAdapter(showPackageInfos,MainViewActivty.this));
    	    		listView.setAdapter(new ListViewAdapter(showPackageInfos,MainViewActivty.this));
    				break;
    			case MenuUtils.MENU_SYSAPP:
    				//显示系统应用
    				showPackageInfos=packageInfos;
    				isUserApp=true;
    				//为listView和gridView设置适配器
    				gridView.setAdapter(new GridViewAdapter(showPackageInfos,MainViewActivty.this));
    	    		listView.setAdapter(new ListViewAdapter(showPackageInfos,MainViewActivty.this));
   					break;
  				case MenuUtils.MENU_SOFTSM:
  					//跳转程序说明Activity
  					Intent intent=new Intent(MainViewActivty.this,About.class);
  					startActivity(intent);
   					break;
    			case MenuUtils.MENU_APPADD:
    				//关于添加软件
    				AlertDialog.Builder alertBuilderadd=new Builder(MainViewActivty.this);
    				alertBuilderadd.setIcon(R.drawable.icon).setTitle("友情提示...").setMessage("功能尚未开发^_^");
    				alertBuilderadd.setPositiveButton("返回",new DialogInterface.OnClickListener() {
    					@Override
    					public void onClick(DialogInterface dialog, int which) {
    						// TODO Auto-generated method stub
    						dialog.cancel();
    					}
    				}).create();
    				alertBuilderadd.show();
    				break;
    			case MenuUtils.MENU_APPSOSO:
    				//软件搜索
    				AlertDialog.Builder alertBuildersoso=new Builder(MainViewActivty.this);
    				alertBuildersoso.setIcon(R.drawable.icon).setTitle("友情提示...").setMessage("功能尚未开发^_^");
    				alertBuildersoso.setPositiveButton("返回",new DialogInterface.OnClickListener() {
    					@Override
    					public void onClick(DialogInterface dialog, int which) {
    						// TODO Auto-generated method stub
    						dialog.cancel();
    					}
    				}).create();
    				alertBuildersoso.show();
    				break;
    			case MenuUtils.MENU_LOGOUT:
    				//退出程序
    				AlertDialog.Builder alertbBuilder = new AlertDialog.Builder(MainViewActivty.this);   
    		        alertbBuilder.setIcon(R.drawable.icon).setTitle("友情提示...").setMessage("你确定要离开吗?");   
    		        alertbBuilder.setPositiveButton("确定", new DialogInterface.OnClickListener() {   
    		        @Override  
    			          public void onClick(DialogInterface dialog, int which) {
    		        	  //在需要结束所有Activity的时候调用exit方法
    		          	  MyApplication.getInstance().exit();
    			          }   
    		          });   
    		          alertbBuilder.setNegativeButton("取消", new DialogInterface.OnClickListener() {   
    		               @Override  
    		               public void onClick(DialogInterface dialog, int which) {   
    		               dialog.cancel();   
    		               }   
    		          }).create();   
    		          alertbBuilder.show();
    				break;
    			}
    		}
    	});
    }
		
}


MenuAdapter.java

package com.feioh;

import java.util.List;

import javax.crypto.spec.PSource;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * 
 * @author yalin
 * 底部菜单 适配器,返回的是 GridView的每一项
 *
 */
public class MenuAdapter extends BaseAdapter {
	
	private final List<MenuInfo> list;
	private final LayoutInflater inflater;
	
	public MenuAdapter(Context context,List<MenuInfo> list)
	{
		this.list=list;
		inflater=LayoutInflater.from(context);
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return list.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return list.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		if(convertView==null)
		{	
			//得到每一项 视图
			convertView=inflater.inflate(R.layout.menu_item,null);
		}
		MenuInfo menuinfo=list.get(position);
		
		//得到每一项的视图
		ImageView iv=(ImageView) convertView.findViewById(R.id.item_image);
		TextView tv=(TextView) convertView.findViewById(R.id.item_text);
		
		//为每一项 设置图片和文字 信息
		iv.setImageResource(menuinfo.imgsrc);
		tv.setText(menuinfo.title);
		
		if(menuinfo.ishide)
		{
			iv.setAlpha(80);
		}
		return convertView;
	}

}


MenuInfo.java

package com.feioh;


public class MenuInfo {
	
	public String title;//标题
	public int imgsrc;//图片资源
	public boolean ishide;//是否隐藏
	public int menuId;//menuId
	
	public MenuInfo(int menuId, String title,int imgsrc,Boolean ishide)
	{
		this.menuId=menuId;
		this.title=title;
		this.imgsrc=imgsrc;
		this.ishide=ishide;
	} 
}


MenuUtils.java

package com.feioh;

import java.util.ArrayList;
import java.util.List;


public class MenuUtils {
	public static final int MENU_LIEBIAO=1;
	public static final int MENU_WANGGE=2;
	public static final int MENU_USERAPP=3;
	public static final int MENU_SYSAPP=4;
	public static final int MENU_APPADD=5;
	public static final int MENU_APPSOSO=6;
	public static final int MENU_SOFTSM=7;
	public static final int MENU_LOGOUT=8;
	
	/**
	 * 获取当前菜单列表
	 * @return
	 */
	public static List<MenuInfo> getMenuList(){
		List<MenuInfo> list=new ArrayList<MenuInfo>();
			list.add(new MenuInfo(MENU_LIEBIAO,"列表视图",R.drawable.menu_ic_setting,false));
			list.add(new MenuInfo(MENU_WANGGE,"网格视图",R.drawable.menu_ic_logout,false));
			list.add(new MenuInfo(MENU_USERAPP,"用户应用",R.drawable.menu_ic_help,false));
			list.add(new MenuInfo(MENU_SYSAPP,"系统应用",R.drawable.menu_ic_exit,false));
			list.add(new MenuInfo(MENU_APPADD,"应用添加",R.drawable.menu_ic_search_friend,false));
			list.add(new MenuInfo(MENU_APPSOSO,"应用搜索",R.drawable.menu_ic_addgroup,false));
			list.add(new MenuInfo(MENU_SOFTSM,"系统说明",R.drawable.menu_ic_addfriend,false));
			list.add(new MenuInfo(MENU_LOGOUT,"退出系统",R.drawable.menu_ic_search_friend,false));
		return list;
	}
	
}


MyApplication.java

package com.feioh;

import java.util.LinkedList;
import java.util.List;

import android.app.Activity;
import android.app.Application;

/**
* 在每一个Activity的onCreate方法中添加Activity到MyApplication对象实例容器中
* MyApplication.getInstance().addActivity(this);
* 在需要结束所有Activity的时候调用exit方法
* MyApplication.getInstance().exit();
* */
public class MyApplication extends Application {
	private List<Activity> activityList=new LinkedList<Activity>();
	
	private static MyApplication instance;
	private MyApplication(){}
	
	//单例模式中 获取唯一的MyApplication实例
	public static MyApplication getInstance()
	{
		if(instance==null)
		{
			instance=new MyApplication();
		}
		return instance;
	}
	//添加Activity到容器中
	public void addActivity(Activity activity)
	{
		activityList.add(activity);
	}
	
	//遍历所有Activity,并finish
	public void exit()
	{
		for(Activity activity:activityList)
		{
			activity.finish();
		}
		System.exit(0);
	}
}


 

源代码下载地址:Android平台手机UI应用开发——软件管理器




 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Android UI开发专题 Android UI开发专题(一) 之界面设计 近期很多网友对Android用户界面的设计表示很感兴趣,对于Android UI开发自绘控件和游戏制作而言掌握好绘图基础是必不可少的。本次专题分10节来讲述,有关OpenGL ES相关的可能将放到以后再透露。本次主要涉及以下四个包的相关内容:  android.content.res 资源类   android.graphics 底层图形类   android.view 显示类   android.widget 控件类   一、android.content.res.Resources   对于Android平台的资源类android.content.res.Resources可能很多网友比较陌生,一起来看看SDK上是怎么介绍的吧,Contains classes for accessing application resources, such as raw asset files, colors, drawables, media or other other files in the package, plus important device configuration details (orientation, input types, etc.) that affect how the application may behave.平时用到的二进制源文件raw、颜色colors、图形drawables和多媒体文件media的相关资源均通过该类来管理。   int getColor(int id) 对应res/values/colors.xml   Drawable getDrawable(int id) 对应res/drawable/   XmlResourceParser getLayout(int id) 对应res/layout/   String getString(int id) 和CharSequence getText(int id) 对应res/values/strings.xml   InputStream openRawResource(int id) 对应res/raw/   void parseBundleExtra (String tagName, AttributeSet attrs, Bundle outBundle) 对应res/xml/   String[] getStringArray(int id) res/values/arrays.xml   float getDimension(int id) res/values/dimens.xml

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值