下载时显示进度条
在文件下载处理业务类中
1 public File getFile(String path,String filePath,ProgressDialog pd)throws Exception{ 2 URL url=new URL(path); 3 HttpURLConnection conn=(HttpURLConnection) url.openConnection(); 4 conn.setRequestMethod("GET"); 5 conn.setConnectTimeout(2000); 6 int coad=conn.getResponseCode(); 7 if(coad==200){//当匹配返回码时,将输入流里的东西全部写到输出流里面 8 int total=conn.getContentLength(); 9 pd.setMax(total); 10 InputStream is=conn.getInputStream();//得到服务器的返回流 11 File file=new File(filePath);//创建一个本地文件,用于接收返回来的数据流 12 FileOutputStream out=new FileOutputStream(file); //创建输出流,将 13 byte[] buffer=new byte[1024]; 14 int len=0;//计算读流的长度 15 int process=0;//设置进度条的初始值为0 16 while( (len = is.read(buffer))!=-1){//当读到的长度不为-1时,即还没有读到文件的末尾 17 out.write(buffer, 0, len);//将buffer中的内容读到输出流里面 18 process+=len;//将数据长度赋给进度 19 pd.setProgress(process);//将进度值加入到进度条中 20 21 } 22 out.flush(); 23 out.close(); 24 is.close(); 25 return file; 26 } 27 return null; 28 }View Code
主界面中pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置水平的下载进度条
然后调用此业务类方法
让Activity停顿3秒
这个必须放在子线程中操作
先创建一个子线程停顿3秒,然后调用Handler机制告知主线程
//让当前Activity延时2秒钟 new Thread(){ @Override public void run() { super.run(); try { sleep(2000); handler.sendEmptyMessage(0);//放送空消息 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }.start();
private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) {//接收子线程传来的消息 // TODO Auto-generated method stub super.handleMessage(msg); //isNeedUpdate(versionText);//创建该方法进行比较 if(isNeedUpdate(versiontext)){ Log.i(TAG, "弹出升级提示对话框"); showUpdateDialog();//用方法实现 } } };
3、在更新程序的时候,必须保证程序的签名和包名相同
C:UsersAdministrator.androiddebug.keystore这是程序开发时生成的签名文件,当我们发布程序的时候要有个自己的签名。
签名生成方法:选择程序导出Export Android Application选择工程生成签名填写相关信息来生打包APK文件
4Activity.this和applicationContext两种上下文的却别
要挂载对话框,则要在Activity中。
土司则两者都可以挂载
applicationContext:生命周期,进程存在,上下文就存在
activity.this:activity在任务栈上下文存在
5、创建gridView的布局(本例为网格视图)
创建一个GridView布局
<?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:orientation="vertical" android:background="@color/background" > <GridView android:id="@+id/gv" android:layout_width="fill_parent" android:layout_height="fill_parent" android:horizontalSpacing="15dip"//每个图标之间的间距 android:verticalSpacing="15dip" android:numColumns="3"//此处设置3列 ></GridView> </LinearLayout>
为gridView创建适配器
定义出图标布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="100dip"
android:layout_height="100dip"
android:orientation="vertical"
android:gravity="center"
android:background="@drawable/icon_background">
<ImageView
android:layout_width="60dip"
android:layout_height="60dip"
android:id="@+id/icon_iv"
android:scaleType="fitXY"//设置图片缩放
android:src="@drawable/ic_launcher"
/>
<TextView
android:id="@+id/icon_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="功能名称"
android:textSize="18sp"
android:textColor="#ffd0d0d0"
/>
</LinearLayout>
给这个图标布局设置背景icon_background.xml(在drawable文件夹下)
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <stroke android:width="1dip" android:color="#ff202020"/> <corners android:radius="2dip"/> <solid android:color="#ff404040" /> </shape>
适配器文件mainAdapter.java
package com.example.mobilesafe.adapter; 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; import com.example.mobilesafe.R; public class mainAdapter extends BaseAdapter{ private LayoutInflater inflater; private Context context; private static ImageView icon_iv; private static TextView icon_tv; public mainAdapter(Context context) {//要有填充器先得拿到构造方法 this.context = context; inflater=LayoutInflater.from(context);//将填充器初始化 } private static String[] mainNames={"手机防盗","通讯卫士","软件管理","任务管理","上网管理", "手机杀毒","系统优化","高级工具","设置中心"}; private static int[] mainPics={R.drawable.widget01,R.drawable.widget02,R.drawable.widget03,R.drawable.widget04 ,R.drawable.widget05,R.drawable.widget06,R.drawable.widget07,R.drawable.widget08,R.drawable.widget08}; @Override public int getCount() { // TODO Auto-generated method stub return mainNames.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertview, ViewGroup arg2) { //gridView有bug因此该方法将被调用2*9次,占内存,为了提高效率。可以将icon_iv与icon_tv设置为静态变量 View view=inflater.inflate(R.layout.mainscreen_item, null);//将资源文件填充为View对象 icon_iv=(ImageView) view.findViewById(R.id.icon_iv); icon_tv=(TextView) view.findViewById(R.id.icon_tv); icon_iv.setImageResource(mainPics[position]);//将图标的图片填入 icon_tv.setText(mainNames[position]);//将图标的文本填入 return view; } }
对gridView中的每个图标设置监听事件
gv.setOnItemClickListener(this);//对gridView中的每一个功能实现监听,需要Activity加监听接口 @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub switch (position) { case 0: Log.i(TAG, "进入手机防盗"); break; default: break; } }
对每个图标进行长按监听,当长按时弹出对话框,提供修改图标名称的功能
private SharedPreferences sp;//yonglai持久化数据 sp=this.getSharedPreferences("config", Context.MODE_PRIVATE);//将sharePreference初始化,生成config文件,访问模式为私有模式 gv.setOnItemLongClickListener(new OnItemLongClickListener() {//设置长按来更改图标名 @Override public boolean onItemLongClick(AdapterView<?> parent, final View view, int position, long id) { if(position==0){ final EditText et=new EditText(mainActivity.this); et.setHint("请输入你要更改的名称"); new AlertDialog.Builder(mainActivity.this) .setTitle("更改标题") .setView(et) .setPositiveButton("确定",new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub String placedName=et.getText().toString().trim(); if("".equals(placedName)){ Toast.makeText(getApplicationContext(), "不能为空呀", 0).show(); return; }else{ Editor editor=sp.edit();//创建Editor对象写数据 editor.putString("lost_name", placedName);//将数据写入 editor.commit();//将数据提交 TextView tv=(TextView)view.findViewById(R.id.icon_tv); tv.setText(placedName); } } }) .setNegativeButton("取消", null) .show(); } return false; } });
在适配器方法mainAdapter.java中进行更改
private SharedPreferences sp;
....
sp=context.getSharedPreferences("config", context.MODE_PRIVATE);
.....
@Override
public View getView(int position, View convertview, ViewGroup arg2) {
//gridView有bug因此该方法将被调用2*9次,占内存,为了提高效率。可以将icon_iv与icon_tv设置为静态变量
View view=inflater.inflate(R.layout.mainscreen_item, null);//将资源文件填充为View对象
icon_iv=(ImageView) view.findViewById(R.id.icon_iv);
icon_tv=(TextView) view.findViewById(R.id.icon_tv);
icon_iv.setImageResource(mainPics[position]);//将图标的图片填入
icon_tv.setText(mainNames[position]);//将图标的文本填入
if(position==0){
String name=sp.getString("lost_name", null);//拿出SharedPreferences中存入的值
if(name!=null){
icon_tv.setText(name);//将标图名设置为新值
}
}
return view;
}