Android开发细节--查漏补缺(二):易忘难懂

   2016-11-03 0
核心提示:这篇文章先汇总一下部分在平常容易遇到或可能遇到的一些难以理解或者容易忘记是什么的问题。android:supportsRtl=”true”是什么?android:supportsRtl=true 故名思义,“Rtl”就是“right to left” ,一般用于适配language文本方向,如切换系统语言为阿拉伯

这篇文章先汇总一下部分在平常容易遇到或可能遇到的一些难以理解或者容易忘记是什么的问题。

  1. android:supportsRtl=”true”是什么?

    android:supportsRtl="true" 故名思义,“Rtl”就是“right to left” ,一般用于适配language文本方向,如切换系统语言为阿拉伯文时,actionbar布局要变为从右向左排列,就需要这个属性。

    注意:

    此属性最低SDK版本为17(Android 4.2.x)

    在使用这个属性时,尽量不适用 layout_marginRight 这类,而是使用 layout_marginEnd 这种。

  2. Android res/menu/my_nemu.xml中不易记的属性:

    • android: alphabeticShortcut =”n” :表示快捷键为:Ctrl+n 、Alt+n
    • android: orderInCategory = “3”:表示在菜单列表中的排序,值可以为大于等于0的任何整数,数值越小,排序越前。
    • android: checkableBehavior = “single|all|none”:分别表示radio button、checkbox、checkable=false
    • …… : 用一个组,包含几个menu_item,这样,组内部的item的顺序就可以重新定义。
  3. Android中用Java代码设置菜单项快捷键的方法:

    menu.setQwertyMode(true);
    menu.findItem(TWO_ID).setNumericShortcut('2');
    
  4. 中子view的属性:

    • android:below=”@+id/xx” :表示本view在xx的下面
    • android:above=”@+id/xx” :表示本view在xx的上面
  5. implements Parcelable的对象的一般写法:(详见我的另一篇博文: Android AIDL基础 – Parcelable接口

    public class Student implements Parcelable{
     ///-------------------------------
     /// (1):基本类型、String/CharSequence、Bundle、IBinder、Serializable、Parcelable 的成员
     private T t;
     ……
     ///---------------------------------
     ///(2):构造方法(可选,怎么方便赋值成员变量值并构建实例,就怎么写)
     public Student() {
     ……
     }
     //=========================================================
     // 下面是Parcelable需要实现的方法
     //=========================================================
     protected Student(Parcel in) {
     ///建议:按成员变量顺序写【因为:需要与writeToParcel()方法中的写入顺序一致】
     id = in.readInt();//如:基本数据类型成员
     name = in.readString();//如:String类型成员
     home = in.readParcelable(Address.class.getClassLoader());//如:Parcelable类型成员
     ……
     }
     public static final Creator<Student> CREATOR = new Creator<Student>() {
     ///CREATOR成员,格式必须如下,‘CREATOR’变量名也固定。
     @Override
     public Student createFromParcel(Parcel in) {
     return new Student(in);
     }
     @Override
     public Student[] newArray(int size) {
     return new Student[size];
     }
     };
     @Override
     public int describeContents() {
     /// 描述标志,默认为0即可
     return 0;
     }
     @Override
     public void writeToParcel(Parcel dest, int flags) {
     ////写入Parcel的方法【需要与writeToParcel()方法中的写入顺序一致】
     dest.writeInt(id);
     dest.writeString(name);
     dest.writeParcelable(home, flags);
     ……
     }
    }
    
  6. Android Studio获取Android签名证书SHA1的简易步骤:

    • Android Studio中打开terminal或者配置了全局变量之后直接打开终端输入:
      keytool -list -v -keystore 你的签名文件所在的路径
    • 输入密钥库密码
    • 成功显示:MD5、SHA1、SHA256等信息

      想知道Eclipse的获取方式,更详细的地址可以看: SHA1查看

  7. JSON封装库的效率对比:

    如果对JSON的解析速度敏感:大文件用: Jackson ,小文件用: Gson ,两种文件都有用: JSON.simple

  8. Java代码执行new一个类实例对象的过程中,static块、static方法、main方法的执行顺序:
    • static块【最先执行,因为静态代码块属于类层次,在类编译时就执行】
    • -> main方法
    • -> 成员块
    • -> 构造方法
    • -> static方法【在被调用时才执行】

      详细可以看看本人的相关文章: Java面试相关(一)– Java类加载全过程

  9. 在写Fragment的时候,Fragment.onCreateView()方法中,一般是这样的一个结构:
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     if (rootLayout == null) {
     rootLayout = inflater.inflate(R.layout.fragment_reclist, null);///①
     rootLayout = inflater.inflate(R.layout.fragment_reclist, container, false);///②
     ///rootLayout = inflater.inflate(R.layout.fragment_reclist, container);///③这样不行!!
     …… 
     }
    ……
    return rootLayout;
    }
    

这里,要注意代码中注释掉的地方,这里有一个对于Fragment的知识点:

inflater.inflate(id, ViewGroup);

说明:

这个方法传入:【目的布局的R.layout 的id】 + 【目的布局的父容器】。那么,对于Fragment的来说,Fragment的onCreateView()方式最终返回的View会自动判断本Fragment所在的父容器位置。

为什么上面代码③不行呢?答:因为 inflater.inflate(id, ViewGroup); 最终会调用 inflater.inflate(id, ViewGroup,boolean); 方法,当ViewGroup不为null时,这方法的第三个参数值会为true,表示的是‘inflate出来的布局自动加到它的父viewgroup中’,那么问题就来了,如果这个父布局是一个ViewPager或者其他不易确定子View放置位置的容器,那么,方法就会 报错 ,因为找不到插入点!所以,对于Fragment的布局,一般情况不需要设置自动添加到父布局,所以,上述代码①和②二选一都可以。

  1. Fragment 与 它所在的Activity的生命周期方法执行次序:

    下面用一个常用布局作为示例【FragmentActivity中用ViewPager装载两个Fragment 部分代码示例】来演示 ,看运行的Log就可以说明整个执行顺序:

    public class CommonTabActivity extends FragmentActivity {
    ……
    /// TabLayout + ViewPager的主界面容器
    PagerAdapter mPagerAdapter;
    ViewPager mViewPager;
    TabLayout mTabLayout;
    ////两个 Fragment
    RecListFragment homeFragment;
    RecListFragment collectionFragment;
    ……
     @Override
     protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_commontab);
     initView();
     }
     private void initView() {
     ///初始化ViewPager等控件
     ……
    
     mPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
     @Override
     public Fragment getItem(int position) {
     switch (position) {
    /////////////////////////使用第一个Fragment
     case 0:
     default: 
     if(homeFragment==null){
     homeFragment = new RecListFragment();
     }
     return homeFragment;
    ///////////////////////////使用第二个Fragment
     case 1:
     if (collectionFragment==null){
     collectionFragment = new RecListFragment();
     }
     return collectionFragment;
     }
     }
     …………
     };
     mViewPager.setAdapter(mPagerAdapter);
     mTabLayout.setupWithViewPager(mViewPager);
     }
    }
    

    上面的结构大家应该都比较熟悉,那么,我测试后给大家列出几种情况下Activity和两个Fragment的生命周期方法执行情况:

    • 本Activity被startActivity()等方式启动:

      Android开发细节--查漏补缺(二):易忘难懂
    • 本Activity由于点击HOME、MENU等弹回桌面时:

      下图是Android N版本下点击MENU按键时的操作截图(类似平常我们长按HOME键弹出运行中程序):

      Android开发细节--查漏补缺(二):易忘难懂 Android开发细节--查漏补缺(二):易忘难懂
    • 本Activity启动其他Activity,并被完全遮掩覆盖时:
      Android开发细节--查漏补缺(二):易忘难懂
    • Activity退出时:
      Android开发细节--查漏补缺(二):易忘难懂
    • 总结:
      • 启动Activity时,由于ViewPager默认采用预加载的方式,所以,虽然默认显示第一个Fragment,第二个Fragment依然会被加载和初始化。
      • 启动Activity时,Activity先执行了它本身的onCreate()->on Start()->onResume(),之后,ViewPager才真的开始运行起来并加载指定给他的Fragment,Fragment才开始它的生命周期。
      • 不论Activity是被另一个Activity覆盖、还是App被返回桌面、或者是弹出启动中应用的界面遮掩Activity,此时,Activity都是被完全遮掩(弹出Dialog等不全屏的窗体时,Activity属于部分被遮掩),此时,Activity都会调用到on Stop()方法,并且这种方式中Fragment与Activity的生命周期方法执行顺序都一样(如上面截图)。
      • 当Activity退出时,①Fragment执行on Stop()后,Activity再执行on Stop() ②Fragment执行onDestroyView()和onDestroy()后,Activity才执行onDestroy()
    • 另外,如果到这里,忘了Fragment整个生命周期是怎么样的,这里,本人附上 Fragment的生命周期图解
      Android开发细节--查漏补缺(二):易忘难懂
  2. 关于v4、v7、v13兼容包:
    • Android Support v4: 为了兼容Android1.6及更高版本而设计的。(eclipse新建工程时,都默认带有v4包)
    • Android Support v7: 为了兼容Android2.1及以上版本而设计的,但不包含更低,故如果不考虑1.6,我们可以采用再加上这个包,另外注意,v7是要依赖v4这个包的,即,两个得同时被包含。
    • Android Support v13: 为了Android 3.2及更高版本的,一般我们都不常用,平板开发中能用到。

感谢阅读~

本篇文章将持续更新~

喜欢的读者可以点个关注,本人将持续发布Android相关文章~

 
标签: 安卓开发
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 安卓中通知功能的具体实现
    安卓中通知功能的具体实现
    通知[Notification]是Android中比较有特色的功能,当某个应用程序希望给用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知实现。使用通知的步骤1、需要一个NotificationManager来获得NotificationManager manager = (NotificationManager
    02-05 安卓开发
  • Android view系统分析-setContentView
    Android view系统分析-setContentView
    第一天上班,列了一下今年要学习的东西。主要就是深入学习Android相关的系统源代码,夯实基础。对于学习Android系统源代码,也没什么大概,就从我们平常使用最基础的东西学起,也就是从view这个切入点开始学习Android的源码,在没分析源码之前,我们有的时候
    02-05 安卓开发
  • 如何进行网络视频截图/获取视频的缩略图
    如何进行网络视频截图/获取视频的缩略图
    小编导读:获取视频的缩略图,截图正在播放的视频某一帧,是在音视频开发中,常遇到的问题。本文是主要用于点播中截图视频,同时还可以获取点播视频的缩略图进行显示,留下一个问题,如下图所示, 如果要获取直播中节目视频缩略图,该怎么做呢?(ps:直播是直
  • Android NDK 层发起 HTTP 请求的问题及解决
    Android NDK 层发起 HTTP 请求的问题及解决
    前言新的一年,大家新年快乐~~鸡年大吉!本次给大家带来何老师的最新文章~虽然何老师还在过节,但依然放心不下广大开发者,在此佳节还未结束之际,给大家带来最新的技术分享~ 事件的起因不说了,总之是需要实现一个 NDK 层的网络请求。为了多端适用,还是选择
  • Android插件化(六): OpenAtlasの改写aapt以防止资源ID冲突
    Android插件化(六): OpenAtlasの改写aapt以防
    引言Android应用程序的编译中,负责资源打包的是aapt,如果不对打包后的资源ID进行控制,就会导致插件中的资源ID冲突。所以,我们需要改写aapt的源码,以达到通过某种方式传递资源ID的Package ID,通过aapt打包时获取到这个Package ID并且应用才插件资源的命名
    02-05 安卓开发
  • Android架构(一)MVP架构在Android中的实践
    Android架构(一)MVP架构在Android中的实践
    为什么要重视程序的架构设计 对程序进行架构设计的原因,归根结底是为了 提高生产力 。通过设计是程序模块化,做到模块内部的 高聚合 和模块之间的 低耦合 (如依赖注入就是低耦合的集中体现)。 这样做的好处是使得程序开发过程中,开发人员主需要专注于一点,
    02-05 安卓开发
  • 安卓逆向系列教程 4.2 分析锁机软件
    安卓逆向系列教程 4.2 分析锁机软件
    安卓逆向系列教程 4.2 分析锁机软件 作者: 飞龙 这个教程中我们要分析一个锁机软件。像这种软件都比较简单,完全可以顺着入口看下去,但我这里还是用关键点来定位。首先这个软件的截图是这样,进入这个界面之后,除非退出模拟器,否则没办法回到桌面。上面那
    02-05 安卓开发
  • Android插件化(二):OpenAtlas插件安装过程分析
    Android插件化(二):OpenAtlas插件安装过程分析
    在前一篇博客 Android插件化(一):OpenAtlas架构以及实现原理概要 中,我们对应Android插件化存在的问题,实现原理,以及目前的实现方案进行了简单的叙述。从这篇开始,我们要深入到OpenAtlas的源码中进行插件安装过程的分析。 插件的安装分为3种:宿主启动时立
    02-05 安卓开发
  • [译] Android API 指南
    [译] Android API 指南
    众所周知,Android开发者有中文网站了,API 指南一眼看去最左侧的菜单都是中文,然而点进去内容还是很多是英文,并没有全部翻译,我这里整理了API 指南的目录,便于查看,如果之前还没有通读,现在可以好好看一遍。注意,如果标题带有英文,说明官方还没有翻
  • 使用FileProvider解决file:// URI引起的FileUriExposedException
    使用FileProvider解决file:// URI引起的FileUri
    问题以下是一段简单的代码,它调用系统的相机app来拍摄照片:void takePhoto(String cameraPhotoPath) {File cameraPhoto = new File(cameraPhotoPath);Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);takePhotoIntent.putExtra(Medi
    02-05 安卓开发
点击排行