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相关推荐

  1. Android build.gradle文件详解(转述自《Android第一行代码》第二版)

    Android build.gradle文件详解 1. 最外层目录下的build.gradle文件 1.1 repostories 1.2 dependencies 2. app目录下的build.g ...

  2. Android第一行代码学习思考笔记(碎片、广播、持久化技术和Android数据库)

    Android第一行代码学习思考笔记(碎片.广播.持久化技术和Android数据库 第四章 手机平板要兼顾--探究碎片 4.1碎片是什么(Fragment) 4.2碎片的使用方式 4.2.1碎片的简单 ...

  3. Android第一行代码-Activity

    文章目录 Android第一行代码 Activity 1.Activity基本用法 2.创建和加载布局 加载布局(在Activity中加载布局) 在AndroidManifest文件中注册(所有的ac ...

  4. Android第一行代码(第一行代码、活动)

    一.第一行代码 1.了解全貌 1.1Android的系统架构 Android的系统架构:Linux内核层.系统运行库层.应用框架层和应用层 1.Linux内核层 Android系统是基于Linux内核 ...

  5. Handler内存泄漏问题解决方案(Android,第一行代码,This Handler class should be static or leaks might occur)

    1 问题背景 博主最近在复习<第一行代码>的第10.2.2章节--在子线程中更新UI,书中给出的在UI主线程中用匿名内部类实现Handler的写法如下: private Handler h ...

  6. Android开发之LitePal数据库的使用(参考于《Android 第一行代码》)

    配置相关文件 在使用之前要进行相关配置,首先要在app.build.gradle中引入LitePal的依赖(下面最后一行代码) dependencies {implementation fileTre ...

  7. Android第一行代码第二版简要总结

    进入安卓的第一本书(简要概括) 第一章 了解大体Android 1.Android系统架构 Linux内核层:为Android设备的各种硬件提供了底层的驱动. 系统运行库层:通过c/c++库来提供主要 ...

  8. 《Android 第一行代码》十一章 Service学习笔记

    Android中Service学习笔记 Service的基本使用方法 Service的启动方式有两种,第一种是使用startService()和stopService()方法来启动和停止Service ...

  9. (Android第一行代码)活动的启动模式

    活动的启动模式 启动模式一共有四种,分别是 standard.singleTop. singleTask 和 singleInstance,可以在 AndroidManifest.xml 中通过给&l ...

  10. Android第一行代码——第三章:控件的使用方法5A-00-1A-C4-8C-55(2009+jjy)

    标题:这章主要学习如何控件的使用方法 1 TextView. 创建activity_main.xml中的代码 代码如下: <?xml version="1.0" encodi ...

最新文章

  1. java 不可修改的集合对象_java集合:关于hashmap存储一个对象,中间改变对象的值,为什么再remove不能用新名字来删除...
  2. c语言 遍历.jpg图像,求指导,如何用c语言实现读取*.raw格式图像
  3. 546. Remove Boxes 移除盒子
  4. sql几种删除语句的联系与区别
  5. mysql+导出当前配置,mysql 查看当前使用的配置文件my.cnf的方法
  6. C++map容器-排序
  7. 使用所有对象通用的方法
  8. 打印hello world java_java – 如何打印“hello world”?
  9. MYSQL GROUP BY 对多个字段进行分组
  10. Visual C++ 2008入门经典 第十章标准模板库(二)
  11. php跳转post,php如何使用post跳转页面
  12. python机器学习案例系列教程——GBDT构建新特征
  13. 190609每日一句,科比·布莱恩特:这就是我成功的原因,即使身陷低谷,也要抬头仰望星空
  14. 最全整理反面角色谁更适合饰演老大角色,你认识多少?(已收藏)
  15. 2020PayPal提现有哪些渠道?听说注册义乌个体户也可以!
  16. linux使用tab键联想,Linux 下python 如何设置使用tab键
  17. “真正的”欧洲杯,鸡冻不鸡冻?
  18. tcp rst 情况
  19. 仿射密码解密(Affine Cipher)
  20. 移动开发的项目管理心得

热门文章

  1. android edittext过滤表情,EditText过滤emoji表情
  2. 计算机设计大赛 app一等奖,广商学子在大学生计算机设计大赛中喜获一等奖
  3. iOS 实现3Dtouch
  4. CCKS2019总结
  5. 用计算机如何算针入度指数,沥青针入度指数怎么计算?需要计算公式,最好说的详细一点!...
  6. 史上最详细的Stacked Hourglass姿态检测算法详解(源码分析)
  7. 魔性计时器html,PDD西卡脸抽不断 拜年秀播出倒计时1天
  8. 海思Hi3518E MPP学习_02视频输入(VI模块)
  9. 傅里叶分析之掐死教程(完整版)更新于2014.06.06
  10. Tomcat修行之路-7.Tomcat-Mapper组件机制以及请求处理机制