1Bundle
Activity之间传递数据
Intent intent = new Intent(AccountManagerActivity.this,SchoolRoomSelectActivity.class);
Bundle bundle=new Bundle();
bundle.putInt("tag", 1);
intent.putExtras(bundle);
startActivity(intent);
Bundle extras = getIntent().getExtras();
tag = extras.getInt("tag", 0);
2SharedPreferences
轻量级的数据存储方式
Editor sharedata = getSharedPreferences("data", 0).edit();
sharedata.putString("item","hello getSharedPreferences");
sharedata.commit();
SharedPreferences sharedata = getSharedPreferences("data", 0);
String data = sharedata.getString("item", null);
3Handler
将工作线程中需更新UI的操作信息 传递到 UI主线程
在工作线程中执行耗时任务,当任务完成时,会返回UI线程,更新UI,有两种方法可以达到目的:
1.handler.sendMessage
2.handler.post
3.runOnUiThread
3.1handler.obtainMessage
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 1) {
//更新UI
}
}
}
new Thread(new Runnable() {
@Override
public void run() {
//这里直接更新ui是不行的
Message msg = handler .obtainMessage(); //或者直接.abtainMessage(code,result)
msg.arg1 = 1;
msg.sendToTarget();
}
}).start();
3.2handler.post
Handler mhandler = new Handler();
mhandler.post(new Runnable() {
@Override
public void run() {
setVisibility(View.VISIBLE);
}
});
3.3runOnUiThread
runOnUiThread(new Runnable() {
@Override
public void run(){};
4保存图片到相册和打开图库
Picasso.with(this).load(AppConfig.GET_BARCODE_IMAGE).into(ivBarCode);//图片加载框架,加载网络图片
if(ivBarCode != null && ivBarCode.getDrawable() != null) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) ivBarCode.getDrawable();//BitmapDrawable是可以绘制的东西
Bitmap bmp = bitmapDrawable.getBitmap();//Bitmap储存的是像素信息
SaveBitmapUtils.saveImageToGallery(BarcodeActivity.this, bmp);
}
public class SaveBitmapUtils {
public static void saveImageToGallery(Context context, Bitmap bmp) {
// 首先保存图片
File appDir = new File(Environment.getExternalStorageDirectory(), "Boohee");//父路径和子路径
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = "barcordzhongshang".concat(AppManager.getAppManager().getVersionCode(context) + "").concat(".jpg");
File file = new File(appDir, fileName);
if (file.exists()) {
Toasty.success(context, "二维码已经在相册,无需重复保存...").show();
return;
}else{
//打开图库
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");//选择类型
startActivity(Intent.createChooser(intent, "查看二维码"));
}
try {
FileOutputStream fos = new FileOutputStream(file);
//Bitmap.CompressFormat图像的压缩格式;quality图像压缩率,0-100,100意味着不压缩;OutputStream stream写入压缩数据的输出流
bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.flush();//flush强制把数据输出,缓存区就清空了
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
Toasty.error(context, "保存失败...").show();
} catch (IOException e) {
e.printStackTrace();
Toasty.error(context, "保存失败...").show();
}
Toasty.success(context, "保存到相册成功...").show();
// 其次把文件插入到系统图库
try {
MediaStore.Images.Media.insertImage(context.getContentResolver(),
file.getAbsolutePath(), fileName, null);//将App中的图片导出到相册,getContentResolver()就是获取实例
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 最后通知图库更新
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);//扫描指定文件
Uri uri = Uri.fromFile(file);//把path转化为Uri
intent.setData(uri);
context.sendBroadcast(intent);//这个广播的目的就是更新图库,发了这个广播进入相册就可以找到你保存的图片了!,记得要传你更新的file哦
}
}
5Activity带参数返回
5.1主Activity
startActivityForResult(intent,0);
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if(requestCode == 0){
if(resultCode == 2){
}
}
}
5.2
Bundle bundle = new Bundle();//把数据放到Bundle里
bundle.putString("result","haha");
Intent intent = new Intent();
intent.putExtras(bundle);
setResult(2,intent);
finish();
6自定义监听器(接口
6.1DropDownMenu.java
private OnDropDownMenuItemListener mOnDropDownMenuItemListener;//使用下面自定义接口
public void setOnDropDownMenuItemListener(OnDropDownMenuItemListener listener) {//自定义接口方法
mOnDropDownMenuItemListener = listener;
}
public interface OnDropDownMenuItemListener {
void onDropDownMenuItemSelected(Menu item);//只允许在同一个包中进行访问
}
mListView.setOnItemClickListener(this);
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if(mOnDropDownMenuItemListener != null) {
mOnDropDownMenuItemListener.onDropDownMenuItemSelected(mMenuList.get(position));
}
}
6.2MainActiivty
mDropDownMenu = new DropDownMenu(MainActivity.this);
mDropDownMenu.setOnDropDownMenuItemListener(new OnDropDownMenuItemListener() {
@Override
public void onDropDownMenuItemSelected(Menu item) {
switch (item.itemId) {
}
mDropDownMenu.dismiss();
}
});
7Drawable / Animation / AnimationDrawable
7.1Drawable
7.1.1setBackgroundDrawable传入一个Drawable对象,例如:
mPopupWindow.setBackgroundDrawable(mContext.getResources().getDrawable(android.R.color.transparent));
7.1.2获取drawable对象
res/drawable/新建一个 xx.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/black" />
</shape>
Drawable d = getResources().getDrawable(R.drawable.bg);
7.1.3setBackgroundResource传入的是一个drawable的id值
7.2Animation
7.2.1
mPopupWindow.setAnimationStyle(R.style.popWindowAnim);//设置动画样式
7.2.2styles.xml
<style name="popWindowAnim" mce_bogus="1" parent="android:Animation">
<item name="android:windowEnterAnimation">@anim/pop_enter_anim</item>
<item name="android:windowExitAnimation">@anim/pop_exit_anim</item>
</style>
7.2.3res – anim – pop_enter_anim.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"> //在set里设置
<scale
android:interpolator="@android:anim/accelerate_interpolator"
android:fromXScale="1.0"
android:toXScale="1.0"
android:fromYScale="0.0"
android:toYScale="1.0"
android:pivotX="0%"
android:pivotY="0%"
android:fillAfter="false"
android:duration="400"/>
</set>
7.3AnimationDrawable逐帧动画
7.3.1
ImageView mLoadImg = (ImageView) v.findViewById(R.id.loading_img);
AnimationDrawable mDrawable = (AnimationDrawable) mLoadImg.getDrawable();//逐帧动画
mDrawable.start();//开启动画
7.3.2
<ImageView
android:id="@+id/loading_img"
android:src="@drawable/loading" />
7.3.3loading.xml
<animation-list android:oneshot="false"
xmlns:android="http://schemas.android.com/apk/res/android">//onshot是否播放一次
<item android:duration="80" android:drawable="@drawable/loading_1" />
<item android:duration="80" android:drawable="@drawable/loading_2" />
</animation-list>
8自定义适配器
private MenuAdapter mAdapter;
mAdapter = new MenuAdapter(mContext, mMenuList);
mListView.setAdapter(mAdapter);
class MenuAdapter extends BaseAdapter {//继承BaseAdapter
private Context mCxt;
private List<Menu> mList;
public MenuAdapter(Context mCxt, List<Menu> mList) {
this.mCxt = mCxt;
this.mList = mList;
}
@Override
public int getCount() {
if(mList == null) return 0;
return mList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = LayoutInflater.from(mCxt).inflate(R.layout.drop_down_menu_item, null);//一项的视图
}
TextView textView = (TextView) convertView.findViewById(R.id.drop_down_menu_item_title);
textView.setText(mList.get(position).itemTitle);
textView.setTextColor(color);
ImageView iv = ((ImageView) convertView.findViewById(R.id.drop_down_menu_item_imag));
if(mList.get(position).itemImagId==-1) {
iv.setVisibility(View.GONE);
} else {
iv.setImageResource(mList.get(position).itemImagId);
}
return convertView;
}
}
9屏幕参数 / 竖屏 / 存储位置 / 数据类型转换 / JSON
9.1获取屏幕参数
mContext.getResources().getDisplayMetrics();
9.2设置竖屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
9.3存储位置
9.3.1App独立文件(删除应用之后,还应该保留在手机上)
//法一(更加灵活,可以自己指定目录)
File sdCard = Environment.getExternalStorageDirectory();
File directory_pictures = new File(sdCard, "Pictures");
//法二(公共目录)
File directory_pictures = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
9.3.2App专属文件(随着app删除而一起删除)
//internal storage
File filesDir = getFilesDir();//shared preference文件,数据库文件
//external storage
File externalFilesDir = getExternalFilesDir(null);//例如该app才能打开的文件
9.4数据类型转化
String.valueOf(sp.getLong("kinderId",0));//由基本数据形态转化为string
Integer.parseInt(String)//将String字符类型数据转换du为Integer整型数据
9.5JSON
new Gson().toJson(request);//转化java对象到json字符串
T backBean = gson.fromJson(result, classOfT);//Json字符串解析出一个对象或者对象数组
10画图
10.1继承AppCompatImageView
public class MyImageView extends android.support.v7.widget.AppCompatImageView {
private float mRadus = 20;
/*圆角的半径,依次为左上角xy半径,右上角,右下角,左下角*/
private float[] rids = {mRadus, mRadus, mRadus, mRadus, mRadus, mRadus, mRadus, mRadus};
protected void onDraw(Canvas canvas) {
Path path = new Path();
int w = this.getWidth();
int h = this.getHeight();
/*向路径中添加圆角矩形。radii数组定义圆角矩形的四个圆角的x,y半径。radii长度必须为8*/
path.addRoundRect(new RectF(0,0,w,h),rids, Path.Direction.CW);
canvas.clipPath(path);
super.onDraw(canvas);
}
}
10.2xml
<com.zsgj.foodsecurity.advertise.ui.MyImageView
android:id="@+id/iv_adv"
android:layout_width="200dp"
android:layout_height="300dp"
android:scaleType="fitXY"
android:src="@drawable/yellow_backage"
android:clickable="true"
/>
11自定义dialog / AlertDialog
11.1Dialog
11.1.1继承Dialog
public class AdvDialog extends Dialog{
public AdvDialog(Context context,String url) {
//重写Dialog默认的主题
super(context, R.style.AdvDialog);
this.mContext = context;
initView(url); //在没有调用show()时,onCreate()方法不会调用,在onCreat方法中进行空间初始化,会报空指针异常
}
public void initView(String url){
super.setCancelable(false);
View view = getLayoutInflater().inflate(R.layout.mainadv_layout, null);//获取布局
setContentView(view);//设置布局
Glide.with(mContext).load(url).into(adv); //加载网络图片
}
public void setAdvOnClickListener(View.OnClickListener listener){
this.adv.setOnClickListener( listener);//变为点击图片
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public void show(){
super.show();//重写
Window dialogWindow = this.getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();//获取布局
dialogWindow.setGravity(Gravity.CENTER_VERTICAL);
lp.y = -35;
dialogWindow.setAttributes(lp);
dialogWindow.setWindowAnimations(R.style.mystyle);
}
}
11.1.2Activity
final AdvDialog advDialog = new AdvDialog(MainActivity.this,popAdvUrl);
advDialog.setCanceledOnTouchOutside(false);
advDialog.show();
advDialog.setAdvOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,AdvShowActivity.class));
advDialog.dismiss();
}
});
11.2AlertDialog
final AlertDialog alertDialog = new AlertDialog.Builder(context).create();
alertDialog.show();
Window window = alertDialog.getWindow();
window.setContentView(R.layout.dialog_diy);//把视图添加到对话框上
12null 和 “ ” / R资源 / Uri.parse / 类方法和实例方法
12.1null 和 equals 和 TextUtils.isEmpty
string类型与null比较用 == ,string类型与空字符串“”比较用 equals
String str1 = null; str引用为空
String str2 = “”; str引用为空串
总结:1)null没有分配内存空间,而""分配了内存空间,因此str1还不是一个实例化的对象,而str2已经实例化
2)TextUtils.isEmpty() 把这个变量作为参数传进去。只要这个参数为空或者为“”,都会返回真
12.2R资源
12.2.1java代码中使用
//获取文字
getResources().getText(R.string.name);//获取string类型的res数据
getResources().getString(R.string.name);
//图片
getDrawable(R.drawable.icon);
//颜色
getResouces().getColor(R.color.red);
//数组
getResources().getStringArray(R.array.title);//得到values里的数组
12.2.2XML代码中使用
<TextViewandroid
android:text="@string/hello_world"
android:background="@drawable/img_back"/>
12.3 Uri.parse
//调web浏览器
Uri myBlogUri = Uri.parse("http://xxxxx.com");
returnIt = new Intent(Intent.ACTION_VIEW, myBlogUri);
//第二种写法
Intent intent= new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri.parse(bean.getAppUrl());
intent.setData(content_url);
((Activity)context).startActivity(intent);
12.4类方法和实例方法
类方法:用static修饰的方法
1)类方法中不能引用对象变量
(static修饰的方法在加载class得时候就加载完成
这个时候构造方法还没执行
此时非static得属性比如成员变量还没初始化
所以不能调用,因为都还不存在)
2)类方法中不能直接调用实例方法
(可以先创建new一个对象,将对象名作为主调)
3)类方法中不能调使用super,this关键字
(因为调用的是类,而不是一个对象,导致this无法找到合适的对象,也就无法代替对象的引用)
4)类方法不能被覆盖
实例方法:类方法可以通过类名调用,实例方法不能通过类名调用
1)实例方法中可以引用对象变量,也可以引用类变量
2)实例方法中可以调用类方法
3)对象方法中可以使用super,this关键字
13abstract / 全屏 / 定时 / 版本号 / 判断,访问,检测权限
13.1abstract
abstract方法只允许声明,不允许实现(因为没有方法体)
1)abstract类中可以有abstract方法
abstract类中可以有abstract方法,也可以有非abstract方法
非abstract类中不可以有abstract方法
2)abstract类不能使用new运算符创建对象
创建该对象必须要重写父类的抽象方法
不允许使用 final / static / private 和abstract同时修饰一个类或者方法
3)abstract类的子类
如果一个非abstract类是abstract类的子类,它必须重写父类的abstract方法
如果一个abstract类是abstract类的子类,它可以重写父类的abstract方法,也可以继承父类的abstract方法
13.2全屏
//定义全屏参数
int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN;
//获得当前窗体对象
Window window = WelcomeActivity.this.getWindow();
//设置当前窗体为全屏显示
window.setFlags(flag, flag);
13.3定时
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
Intent intent = new Intent(WelcomeActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//销毁目标Activity和它之上的所有Activity,重新创建目标Activity
intent.putExtra("formWelcome", 1);
startActivity(intent);
finish();
}
}, 3000);
13.4版本号
context.getPackageManager().getPackageInfo("com.zsgj.foodsecurity", 0).versionCode;
13.5.1判断权限
PackageManager pm = context.getPackageManager();
permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.WRITE_EXTERNAL_STORAGE", "com.zsgj.foodsecurity"));
13.5.2sd卡权限检测
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)//sd存在且具有读写权限
13.5.3检测权限
1)@RuntimePermissions 注释在需要权限的Activity和Fragment
2)@NeedsPermission 注释在需要权限的方法上后面,需要传入所需的权限
@OnShowRationale 注释在向用户解释为什么需要这个权限的方法上
@OnShowRationale({Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE})
void showRationale(final PermissionRequest request) {//注意该处有参数
new AlertDialog.Builder(this)
.setMessage("为了app更好的用户体验需要使用您授权权限,下一步将继续请求权限,请务必允许...")
.setPositiveButton("下一步", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.proceed();//继续执行请求
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.cancel();//取消执行请求
}
}).show();
}
@OnPermissionDenied 被拒绝后调用的方法
@OnNeverAskAgain 勾选了不再提示禁止后调用的方法(可以弹出框询问是否开启权限)
3)Build -- Make Project
自动生成[Activity Name] + PermissionsDispatcher这样的一个类
4)复写onRequestPermissionsResult方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
13.6访问权限
接口不写修饰符默认public,类不写修饰符默认default
private
14下载 / scaleType / inflate / 转化时间 / 宽高参数
14.1下载
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.xx//官网上查询配置
final DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);//请求下载服务
// 添加一个下载任务
long downloadId = downloadManager.enqueue(request);//放入队列,获取下载id
14.2scaleType
1)center
保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size时,多出来的部分被截掉。
2)center_inside
以原图正常显示为目的,如果原图大小大于ImageView的size,就按照比例缩小原图的宽高,居中显示在ImageView中。如果原图size小于ImageView的size,则不做处理居中显示图片。
3)center_crop
以原图填满ImageView为目的,如果原图size大于ImageView的size,则与center_inside一样,按比例缩小,居中显示在ImageView上。如果原图size小于ImageView的size,则按比例拉升原图的宽和高,填充ImageView居中显示。
4)matrix
不改变原图的大小,从ImageView的左上角开始绘制,超出部分做剪切处理。
5)fit_xy
把图片按照指定的大小在ImageView中显示,拉伸显示图片,不保持原比例,填满ImageView.
6)fit_start
把原图按照比例放大缩小到ImageView的高度,显示在ImageView的start(前部/上部)。
7)fit_center
把原图按照比例放大缩小到ImageView的高度,显示在ImageView的center(中部/居中显示)。
8)fit_end
把原图按照比例放大缩小到ImageView的高度,显示在ImageVIew的end(后部/尾部/底部)
14.3inflate
1)inflate(view, null)
尺寸设置无效果
2)inflate(view, root, false)
只会将resource指定的布局文件填充,要调用root.addView()方法
3)inflate(view, root, true)
指定的布局文件会依附于root指定的ViewGroup
总结:adpater里面不要用true,在为fragment创建布局时,如果为true,那么这个布局文件就会被添加到父activity中盛放fragment的布局中。
14.4转化时间
new SimpleDateFormat("yyyy-MM-dd").format(new Date());//将系统时间转化为字符串
14.5宽高参数
loadingDialog.setContentView(layout, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT))
15Badge / 相对布局属性 / ImageView 和 ImageButton
15.1Badge消息小红点
badge1 = new QBadgeView(MainActivity.this);
badge1.bindTarget(holder.item_ll);//绑定到哪里
badge1.setBadgeText(String.valueOf(sp3.getInt("num",1)));
badge1.setGravityOffset(0,2,true);
badge1.setBadgeBackgroundColor(Color.RED);
badge1.setBadgeTextSize(getResources().getDimension(R.dimen.text_top_size),true);
badge1.setBadgeGravity(Gravity.END | Gravity.TOP);
15.2RelativeLayout属性
15.2.1true / false
centerHrizontal / centerVertical / centerInparent / alignParentBottom / alignParentLeft / alignParentRight / alignParentTop
15.2.2为id的引用名“
16 contains 和 indexOf / substring 和 substr 和 slice / splice
16.1contains 和 inidexOf
1)contains:是找指定字符串是否包含一个子串,返回的是boolean类型
2)indexOf:把匹配的第一个字符的位置返回,返回的是int类型;如果没找到,则返回-1(位置从0开始)
16.2substring 和 substr 和 slice
1)substring:[ beginIndex ,endIndex )
起始索引(包括),索引从 0 开始;结束索引(不包括)(可选),不可以传递负值
2)substr:[ start,length)
从0开始,-1 指字符串中最后一个字符,length为字符串数(可选)
3)slice:[start,end)
从0开始,-1 指最后一个元素,第二个参数(可选),不会修改数组
16.1splice
1)splice:[index,howmany,item1,…,itemx]
index添加/删除项目的位置,可用负数,howmany要删除的项目数量(必须),item向数组添加的新项目(可选),返回被删除/ 添加后的数组(若有item则添加在index位置)