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

希望大家多多支持,雅林和大家一起学习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应用开发——软件管理器

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

  1. 茶百科 android 论文,基于android平台手机茶百科开发_学位论文.doc

    基于android平台手机茶百科开发_学位论文 摘要 随着智能手机一步步走进普通人的生活,它将成为人们获取信息的主要设备.因此,手机的应用服务将会有很大的发展空间,手机茶百科软件就是其中的一项.And ...

  2. Android平台手机记账应用开发视频教程

    基于Android平台的手机记账应用开发全程实录 基于Android平台的手机记账应用开发全程实录(Activity间数据传递.SQLiteDatabase.AsyncTask) 课程讲师:欧楠  课 ...

  3. 茶百科 android代码,基于android平台手机茶百科开发设计---学位论文.doc

    摘要 随着智能手机一步步走进普通人的生活,它将成为人们获取信息的主要设备.因此,手机的应用服务将会有很大的发展空间,手机茶百科软件就是其中的一项.Android平台提供给用户非常方便的茶百科查询功能, ...

  4. 【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity

    问:达叔,你放弃了吗? 答:不,放弃是不可能的,丢了Android,你会心疼吗?如果别人把你丢掉,你是痛苦呢?还是痛苦呢?~ 引导语 有人说,爱上一个人是痛苦的,有人说,喜欢一个人是幸福的. 人与人之 ...

  5. Android中所有UI组件基类是,【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity...

    问:达叔,你放弃了吗? 答:不,放弃是不可能的,丢了Android,你会心疼吗?如果别人把你丢掉,你是痛苦呢?还是痛苦呢?~ 引导语 有人说,爱上一个人是痛苦的,有人说,喜欢一个人是幸福的. 人与人之 ...

  6. android阅读软件怎么开发,Android平台手机文本阅读软件的开发与设计.doc

    Android平台手机文本阅读软件的开发与设计 Android平台手机文本阅读软件的开发与设计 摘要:本文主要阐述了在Android平台上十分流行的文本阅读软件的设计与实现,具有阅读字体大小调节.阅读 ...

  7. Android开发实例-Android平台手机新闻客户端

    Android开发实例<Android平台手机新闻客户端>是基于Android4.0及以上平台的一款新闻类手机应用,应用运行效果如下所示: Android开发实例课程主要介绍运行于Andr ...

  8. android 布局中绘制语音曲线,基于android平台的老年人用药助手软件的开发-仪器仪表工程专业论文.docx...

    基于android平台的老年人用药助手软件的开发-仪器仪表工程专业论文 Classified Index: TP319 U.D.C: 004.45 Dissertation for the Degre ...

  9. android 订餐系统,一种基于Android平台手机订餐系统的实现方法

    一种基于Android平台手机订餐系统的实现方法[ 技术领域: ][0001]本发明涉及一种手机订餐系统,能够通过手机上的Android软件实现订餐.[ 背景技术: ][0002]目前已有的网上订餐系 ...

最新文章

  1. FFTW、Eigen库在VisualStudio中的导入和使用
  2. 离散数学实验题目-集合
  3. Oracle的奇葩设置之非归档模式与RMAN备份
  4. 当众讲话第二章当众讲话的基本原则
  5. ICCV 2021 | 厉害了!首届 SoMoF 人体序列预测比赛冠军方案分享
  6. ERROR InvalidReplicationFactorException: Replication factor: 1 larger than available brokers: 0
  7. centos的一次性任务at和周期性任务crontab
  8. NLP预训练家族 | 自成一派的GPT!
  9. openstack 云主机关机:ournal: End of file while reading data: Input/output error
  10. 章节3.1和3.2----栈的表示、实现和应用
  11. flash服务器停止响应,Adobe Flash Player已经在Windows 10上停止工作
  12. 在Solaris下安装中文语言包
  13. 2018圆通科技面试题目
  14. python中断言方法举例说明_Python中断言Assertion的一些改进方案
  15. 基于时空注意力的图卷积网络在路段级交通预测中的应用
  16. android+路由器+名称,手机更改路由器名称
  17. 使用图像处理技术和卷积神经网络(CNN)的作物病害检测
  18. qt tableb view 打印预览和打印的问题 个人解决办法
  19. 【数据增强】用cv2旋转图像并自定义填充背景颜色(主要用到cv2.getRotationMatrix2D 和 cv2.warpAffine)
  20. c# 如何改变ToolStrip的大小,并向ToolStripButton加载合适大小的Image

热门文章

  1. mediawiki-1.34.0安装扩展CirrusSearch
  2. 转---工作两年后感悟的《大话西游》
  3. 磁盘出现“文件或目录损坏且无法读取”问题解决方法
  4. 使用okhttp请求聚合数据之星座运势
  5. matlab中(),[],与{}的区别认识
  6. 2021深圳500强企业榜单发布,法本信息榜上有名
  7. 硅谷银行倒闭的几点启示
  8. 3D动态锁屏+3D动态壁纸,完美整合到一起!
  9. 汉字转拼音工具类,依赖Pinyin4J
  10. 电商运营的十招,你会几招?