Android代码学习记录

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-100100意味着不压缩;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位置)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值