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{        @Override        public 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{        @Override        public 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;    @Override    public void onCreate() {        super.onCreate();        mContext = getApplicationContext();        //SDK初始化        SDKInitializer.initialize(this);        //litepal初始化        Litepal.initialize(this);    }}

(2)关于配置Java 8,现只需加入compileOptions配置,即可用Lambda表达式

android {    compileSdkVersion 29    buildToolsVersion "29.0.3"    defaultConfig {    ......    }    compileOptions {        sourceCompatibility JavaVersion.VERSION_1_8        targetCompatibility JavaVersion.VERSION_1_8    }

(3)复述下自定义接口

1.构建接口

publicclass 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!!!

再次感谢大家的赏析!!!

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 关于不需要添加android:debuggable属性就可以进行apk的调试一些
  3. android中才Pull解析器生成xml文档
  4. Android之传感器系统(Gsensor) .
  5. App模块化及工程扩展----- android
  6. Android热修复升级探索——SO库修复方案
  7. Android:Touch事件拦截机制
  8. Android(安卓)实现对图片 Exif 的修改(Android(安卓)自带的方法)
  9. android 模拟器和电脑服务器端用socket通讯

随机推荐

  1. Android(安卓)XML解析学习——创建XML
  2. Android(安卓)4.0.1 模拟器内核 最新下载
  3. Android获取ROOT权限的通用方法
  4. Android(安卓)Market上发软件要注意哪些
  5. [Android] 面试题总结-猎趣-Android部分
  6. Android文件存储之使用File
  7. android drawable xml文件 之 shape
  8. Android循环滚动控件——ViewFlipper的使
  9. 你凭啥一定要求android就要比iphone运行
  10. R.swift 让iOS项目像Android(安卓)R 一样