• 基本技术


    下载时显示进度条

    在文件下载处理业务类中

     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 
    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;
    	}
    	
    

      

  • 相关阅读:
    剑指offer(链表)
    设计模式
    谷歌Colab使用(深度学习)
    Consul与python API注册与注销
    【日志收集】之Loki
    【消息队列】之 RabbitMQ安装
    【消息队列】之NSQ安装
    Docker基础
    Python3 , Mysql5.7 , Smb 安装
    SkyWalking部署
  • 原文地址:https://www.cnblogs.com/DASOU/p/3391380.html
Copyright © 2020-2023  润新知