安卓通过jar包使用butterKnife以及拍照相关Intent学习

一:butterknife的引入及使用

annotation(注解)简介

注解是JDK5.0开始的新增特性。为代码添加一句特殊的"说明",添加了注解的代码会引起编译器的“格外重视”
系统提供了一些注解
@Override 
@Deprecated

我们也可以写自己的自定义注解,步骤如下:
step 1 创建注解类。
step 2 在注解类中,声明注解类需要的信息
       这些信息以方法的方式来声明
       注:注解中有一个特殊的信息名称:value
step 3 要利用2个系统已经提供好的元注解来声明第一步创建的自定义注解的使用范围
       注:元注解就是用来注解注解的注解
step 4 要提供对第一步创建的注解的一个注解解释器
一些特殊的写法:
利用资源的名字,反查资源id
例如根据MainActivity这个类名来查询R.layout.activity_main这个布局文件的资源id
step 1:获得类名"MainActivity":
String clazzName = activity.getClass().getSimpleName();
step 2:获得"Main"
int endIdx =  clazzName.indexOf("Activity");
String sub = clazzName.substring(0,endIdx);
step3:获得资源文件的名字"activity_main":
String layoutName = "activity_"+sub.toLowerCase();
step 4:根据资源的名字(字符串)去反查资源的id
int id = activity.getResourc().getIdentifier(layoutName, "layout", activity.getPackageName());
根据获得的资源id进行使用
if(id!=0){
 activity.setContentView(id);
}

以上为自定义注解的写法,某种程度上方便了我们写代码,但是为了方便我们写代码,很多人都会引入第三方架包butterknife来省去我们写findViewbyid这种类似的语句更加方便,只需要简单的几步设置就可以方便的使用了。

1.下载第三方butterknife架包,并将它导入到我们的项目的libs目录下,如下:

2.鼠标右键选择我们导入的butterknife选择Build Path下的Add to BuildPath

3.鼠标右键点击我们的项目名称选择Properties

4.按照图示操作即可

5.再点击下一项,按图示操作即可

这样一个第三方架包butterknife引入就成功了,还需要在项目中进行相应的绑定就可以使用了

1.1在activity中:ButterKnife.bind(this);

1.2在adapter中可以使用这种方式绑定:

public ViewHolder(View convertView){
ButterKnife.bind(this,convertView);
}

二:下面来介绍使用Intent创建选择窗口,以及如何实现textView中显示的时间实时更新

这里以创建一个窗口选择是打开系统相机还是打开系统图库为例

通过启动一个线程,利用handler发消息来实现实时更新textView中的时间显示

代码实现可如下:

package com.example.intentdemo.ui;

import java.io.File;
import java.lang.annotation.ElementType;
import java.text.SimpleDateFormat;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.provider.MediaStore.Images.Media;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;

import com.example.intentdemo.R;

public class MainActivity extends Activity {
private static final int updateNow=1;

@Bind(R.id.tv)
TextView tv;
@Bind(R.id.iv)
ImageView iv;
Button btn;

private String filePath;
private String uriString;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
@OnClick(R.id.btn)
public void show(View v){
new TimeUpdateThread().start();
//打开系统图库
Intent intent1=new Intent(Intent.ACTION_PICK);
intent1.setDataAndType(Media.EXTERNAL_CONTENT_URI, "image/*");
//打开系统相机拍照
Intent intent2=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//拍照后照片的保存路径

File file=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), System.currentTimeMillis()+".jpg");
//拍照后照片在SD卡上的保存路径
uriString=file.getAbsolutePath();
Uri uri=Uri.parse(uriString);
intent2.putExtra(MediaStore.EXTRA_OUTPUT, uri);
//弹出一个对话框让用户选择图片源
Intent intent=Intent.createChooser(intent1, "选择图片加载来源");
intent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{intent2});
startActivityForResult(intent, 100);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==RESULT_OK&&requestCode==100){
if(data!=null){
//图库选择的图片
Uri uri=data.getData();
//通过查询拿到图片在SD卡上的真实地址
Cursor cursor = getContentResolver().query(uri, new String[]{Media.DATA}, null, null, null);
cursor.moveToNext();
filePath=cursor.getString(0);
cursor.close();
}else{
//相机拍摄的照片
filePath=uriString;
}
iv.setImageBitmap(BitmapFactory.decodeFile(filePath));
}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章