Android第一行代码踩坑qwq
Android第一行代码踩坑qwq
- 涉及到需要更新或者更换的方法
- 图片的最优输出方式
- 博主自用功能快捷键
- RecyclerView的点击事件
- 碎片替换方法的简单封装
- 动态注册广播监听网络变化方法过时的改写
- 标准广播
- 利用Git上传代码至GitHub
- 通知的基本使用方法
- 读写文件
- 百度地图开发中的坑
- Material Design
- Android继续进阶
- 总结
涉及到需要更新或者更换的方法
结合在网上部分填坑操作上进行总结跟改写
图片的最优输出方式
setImageResource(int id);最常用的图片输出方式,但容易因为UI耗时而引起程序崩溃.....setImageBitmap()就是把Bitmap对象封装成Drawable对象,更会频繁调用该对象所以建议更改成为:imageView.setImageDrawable(getResources().getDrawable(int id));但是API>19方法会显示过时,这是由于getDrawable(int id,Theme theme)需要第二个参数,可以直接传null或者Context.getDrawable(int)综上,setImageDrawable()是最省内存高效的,当然如果担心图片过大或者图片过多影响内存和加载效率,可以自己解析图片然后通过调用setImageDrawable方法进行设置。
博主自用功能快捷键
Ctrl+R 替换文本
Ctrl+N 可以快速打开类
Ctrl+Q 把光标移至方法处,按此组合键可快速查看方法的说明文档。
Ctrl+E 快速查看最近打开打开过的文件
Alt+F1 查找代码所在位置
Ctrl+D 集合了复制和粘贴两个操作, 如果有选中的部分就复制选中的部分,并在选中部分的后面
shift+F6 可对类、方法、变量进行重命名,使用的地方会自动更新名字。
Alt+Enter 自动修正
Ctrl+空格 输入代码时按此组合键会列出与之相匹配的类、方法名、成员变量等,起智能提示的作用。
Ctrl+斜杠 注释或取消注释当前行或选中的代码块
Ctrl+Alt+T 选中一块代码,按此组合键,可快速添加if 、for、try/catch等语句。
Ctrl+Alt+L 格式化代码
Ctrl+Alt+V 调用方法时传入的参数是比较复杂的表达式时,可用此组合键重构变量,以简化代码的复杂度。
Alt+shift+C 查看工程的最近修改。
Ctrl+鼠标左键直接跳转到类、方法、成员变量定义的地方
Ctrl+shift+I 快速查看方法体,想查看一个方法是如何实现的,可把光标移至方法处,按此组合键
Ctrl+shift+A 快速查找android studio中的菜单
Alt+ Up/Down 代码向上/下移动
Ctrl+Alt+Space 类名或接口名提示
Ctrl+shift+斜杠 注释或取消注释选中的代码块,以“/……/”方式注释。
Ctrl+shift+Enter 自动匹配相对应的语法结构,比如if,do-while,try-catch等结构。
Ctrl+Alt+shift+N 快速打开输入的方法或变量。
Ctrl+Shift+Space 自动补全代码
Ctrl+Shift+Up/Dow在方法间快速移动定位
Ctrl+Alt+shift+I 检测代码,比如检测一些定义了,但没有使用过的变量或方法。检测的目的是为了提高代码效率。
RecyclerView的点击事件
见Android第一行代码P131,鉴于文中作者只给出的内部点击事件实现方式,博主在此给出接口回调这种方法:
(1)定义接口
public static interface OnItemClickListener {void onItemClick(int position);void onItemLongClick(int position);}
(2)声明变量
private OnItemClickListener mOnItemClickListener = null;
(3)选中变量后,Ctrl+O得到其的set()方法
public void setmOnItemClickListener(OnItemClickListener mOnItemClickListener) {this.mOnItemClickListener = mOnItemClickListener;}
(4)在viewHolder注册点击事件
(5)适配器调用
(6)进阶:例如枚举对象进行View的辨别
public static interface OnItemClickListener {void onItemClick(ViewName VIEW,int position);}....public enum ViewName{ITEM,HEADER}
碎片替换方法的简单封装
/*
* manager 消息 使用方法:getSupportFragmentManager() [activity] getActivity()[fragment]
* id frameLayout控件id 使用方法:R.id.frameLayout
* fragment 碎片类 使用方法:new fragment();
* */
public class FragmentUtils {public static void ReplaceFragment(FragmentManager manager, int id, Fragment fragment) {manager.beginTransaction().replace(id, fragment).addToBackStack(null)//跟commit()方法的区别是允许状态值丢失.commitAllowingStateLoss();}
}
动态注册广播监听网络变化方法过时的改写
改写前:见第一行代码P173
过时原因:发现NetworkInfo在API level 29中过时,ConnectivityManager中有许多返回值为NetworkInfo的方法,自此一并不推荐使用。
class NetworkChangeReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();if (networkInfo != null && networkInfo.isAvailable()) {Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show();} else {Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();}}}
改写后:
class NetworkChangeReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);assert connectivityManager != null;NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());if (networkCapabilities!=null){Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show();}else {Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();}}}
标准广播
Android8.0后,广播发送、接受更加严格,需要加入Component参数,intent.setComponent(new ComponentName(“包名”,“接收器类”));自定义动态广播无需实现;
Intent intent = new Intent("com.example.testapplication.MY_BROADCAST");intent.setComponent(new ComponentName("com.example.testapplication","com.example.testapplication.receiver.MyBroadcastReceiver"));sendBroadcast(intent,null);
利用Git上传代码至GitHub
利用Git提交本地代码见P195,成功现实后:
//git与github建立远程连接git remote add origin git@github.com:dustdawn/test.git[ 自己的仓库名 ]//push到远程服务器githubgit push -u origin master//Android实现更新![ 做出更新 ](https://img-blog.csdnimg.cn/20200813115856749.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hkcm9zYXk=,size_16,color_FFFFFF,t_70#pic_center)![ 提交更新事务 ](https://img-blog.csdnimg.cn/20200813115952649.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hkcm9zYXk=,size_16,color_FFFFFF,t_70#pic_center)
通知的基本使用方法
更改前:
Notification notification=new NotificationCompat.Builder(this).setContentText("").build();
原因是升级到Android O 版本后,NotificationCompat.Builder()该方法被以下方法取代:
PendingIntent intent = PendingIntent.getActivity(MainActivity2.this, 0, new Intent(MainActivity2.this, MainActivity3.class), 0);NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);assert manager != null;if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { //Android O (8.0)以上版本需要渠道NotificationChannel notificationChannel = new NotificationChannel("1", "xxx",NotificationManager.IMPORTANCE_HIGH);//通知重要度,DEFAULT及以上,通知时手机默认会有振动manager.createNotificationChannel(notificationChannel);}NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity2.this, "1").setContentTitle("This is content title").setContentText("This is content title").setWhen(System.currentTimeMillis())//需要内容全显示//.setStyle(newNotificationCompat.BigTextStyle().bigText("DASSSSSSSSSSSSSSSSSSSSSSSSSSS"+"SDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"+"DSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +"DSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +"SDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSDA")).setVibrate(new long[]{0,1000,1000,1000})//震动.setLights(Color.RED,1000,1000)//LED灯//.setPriority(NotificationCompat.PRIORITY_MAX)//重要通知//.setDefaults(NotificationCompat.DEFAULT_ALL)//所以 默认设置.setSmallIcon(R.mipmap.ic_launcher).setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)).setContentIntent(intent).setAutoCancel(true);manager.notify(1, builder.build());
读写文件
API 29中弃用getExternalStorageDirectory后如何来读写文件?
String file=Objects.requireNonNull(Content.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)).getPath();
百度地图开发中的坑
(1).SHA1的获取,建议直接使用下面给出的帮助类去打印,因为用命令行获取到自动生成的SHA1很大几率与程序自身的SHA1不符(博主有被坑到…qwq)
public static String sha1(Context context) {try {PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);byte[] cert = info.signatures[0].toByteArray();MessageDigest md = MessageDigest.getInstance("SHA1");byte[] publicKey = md.digest(cert);StringBuilder hexString = new StringBuilder();for (byte b : publicKey) {String appendString = Integer.toHexString(0xFF & b).toUpperCase(Locale.US);if (appendString.length() == 1) {hexString.append("0");}hexString.append(appendString);hexString.append(":");}String result = hexString.toString();return result.substring(0, result.length() - 1);} catch (PackageManager.NameNotFoundException | NoSuchAlgorithmException e) {e.printStackTrace();}return null;}
(2)让地图显示,SDK初始化一定要放在视图绑定的前面
SDKInitializer.initialize(this);//必须放在setContentView方法前setContentView(R.layout.activity_main);
否则报错: you have not supplyed the global app context info from SDKInitializer.initialize(Context) function.
(3)尽量用真机调试
(4)建MarkerOption,用于在地图上添加Marker的话,图标大小一定要合适
Material Design
有基础可以,直接创建项目进行更改
Android继续进阶
(1)获取全局的Content,如刚刚的SDK初始化可以放在里面
class MyApplication extends Application {private static Context mContext;@Overridepublic void onCreate() {super.onCreate();mContext = getApplicationContext();//SDK初始化SDKInitializer.initialize(this);//litepal初始化Litepal.initialize(this);}
}
(2)关于配置Java 8,现只需加入compileOptions配置,即可用Lambda表达式
android {compileSdkVersion 29buildToolsVersion "29.0.3"defaultConfig {......}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
(3)复述下自定义接口
1.构建接口
public
class ToastMylistener {ToastListener toastListener=null;public void setToastListener(ToastListener toastListener) {this.toastListener = toastListener;}public interface ToastListener {void showToast();}
}
2.实现接口
implements ToastMylistener.ToastListener
3.调用方法
textView.setOnClickListener((view -> {showToast();}));
总结
第一行代码,真的是非常实用的工具书( 膜拜郭霖大佬 +。+),博主本来是也想着把前段时间出版不久的第一行代码第三版,学习到的开发经验一起分享出来,奈何最近进度不佳,哈哈哈,不过后续会发布出来希望大家多多支持、指正呀!
此文原创、未经允许、不可转载!!!
博主QQ:691828516 学生党12小时 在线+。+
微信:IU_lost_child 你没看错 博主喜欢的是iu!!!
再次感谢大家的赏析!!!
Android第一行代码踩坑qwq相关推荐
- Android build.gradle文件详解(转述自《Android第一行代码》第二版)
Android build.gradle文件详解 1. 最外层目录下的build.gradle文件 1.1 repostories 1.2 dependencies 2. app目录下的build.g ...
- Android第一行代码学习思考笔记(碎片、广播、持久化技术和Android数据库)
Android第一行代码学习思考笔记(碎片.广播.持久化技术和Android数据库 第四章 手机平板要兼顾--探究碎片 4.1碎片是什么(Fragment) 4.2碎片的使用方式 4.2.1碎片的简单 ...
- Android第一行代码-Activity
文章目录 Android第一行代码 Activity 1.Activity基本用法 2.创建和加载布局 加载布局(在Activity中加载布局) 在AndroidManifest文件中注册(所有的ac ...
- Android第一行代码(第一行代码、活动)
一.第一行代码 1.了解全貌 1.1Android的系统架构 Android的系统架构:Linux内核层.系统运行库层.应用框架层和应用层 1.Linux内核层 Android系统是基于Linux内核 ...
- Handler内存泄漏问题解决方案(Android,第一行代码,This Handler class should be static or leaks might occur)
1 问题背景 博主最近在复习<第一行代码>的第10.2.2章节--在子线程中更新UI,书中给出的在UI主线程中用匿名内部类实现Handler的写法如下: private Handler h ...
- Android开发之LitePal数据库的使用(参考于《Android 第一行代码》)
配置相关文件 在使用之前要进行相关配置,首先要在app.build.gradle中引入LitePal的依赖(下面最后一行代码) dependencies {implementation fileTre ...
- Android第一行代码第二版简要总结
进入安卓的第一本书(简要概括) 第一章 了解大体Android 1.Android系统架构 Linux内核层:为Android设备的各种硬件提供了底层的驱动. 系统运行库层:通过c/c++库来提供主要 ...
- 《Android 第一行代码》十一章 Service学习笔记
Android中Service学习笔记 Service的基本使用方法 Service的启动方式有两种,第一种是使用startService()和stopService()方法来启动和停止Service ...
- (Android第一行代码)活动的启动模式
活动的启动模式 启动模式一共有四种,分别是 standard.singleTop. singleTask 和 singleInstance,可以在 AndroidManifest.xml 中通过给&l ...
- Android第一行代码——第三章:控件的使用方法5A-00-1A-C4-8C-55(2009+jjy)
标题:这章主要学习如何控件的使用方法 1 TextView. 创建activity_main.xml中的代码 代码如下: <?xml version="1.0" encodi ...
最新文章
- java 不可修改的集合对象_java集合:关于hashmap存储一个对象,中间改变对象的值,为什么再remove不能用新名字来删除...
- c语言 遍历.jpg图像,求指导,如何用c语言实现读取*.raw格式图像
- 546. Remove Boxes 移除盒子
- sql几种删除语句的联系与区别
- mysql+导出当前配置,mysql 查看当前使用的配置文件my.cnf的方法
- C++map容器-排序
- 使用所有对象通用的方法
- 打印hello world java_java – 如何打印“hello world”?
- MYSQL GROUP BY 对多个字段进行分组
- Visual C++ 2008入门经典 第十章标准模板库(二)
- php跳转post,php如何使用post跳转页面
- python机器学习案例系列教程——GBDT构建新特征
- 190609每日一句,科比·布莱恩特:这就是我成功的原因,即使身陷低谷,也要抬头仰望星空
- 最全整理反面角色谁更适合饰演老大角色,你认识多少?(已收藏)
- 2020PayPal提现有哪些渠道?听说注册义乌个体户也可以!
- linux使用tab键联想,Linux 下python 如何设置使用tab键
- “真正的”欧洲杯,鸡冻不鸡冻?
- tcp rst 情况
- 仿射密码解密(Affine Cipher)
- 移动开发的项目管理心得
热门文章
- android edittext过滤表情,EditText过滤emoji表情
- 计算机设计大赛 app一等奖,广商学子在大学生计算机设计大赛中喜获一等奖
- iOS 实现3Dtouch
- CCKS2019总结
- 用计算机如何算针入度指数,沥青针入度指数怎么计算?需要计算公式,最好说的详细一点!...
- 史上最详细的Stacked Hourglass姿态检测算法详解(源码分析)
- 魔性计时器html,PDD西卡脸抽不断 拜年秀播出倒计时1天
- 海思Hi3518E MPP学习_02视频输入(VI模块)
- 傅里叶分析之掐死教程(完整版)更新于2014.06.06
- Tomcat修行之路-7.Tomcat-Mapper组件机制以及请求处理机制