神刀安全网

Android开发中小问题汇总(持续更新)


Android开发中小问题汇总(持续更新),此排序没有任何优先级或者重要程度。

此笔记只为记录平时开发中碰到的经常用到确不太注意的一些问题,每次用过就忘记,还要重新搜索解决方案,所以在此积累下平时开发中碰到的一些常用而又容易忘记的简单小bug。

  1. Android 如何让EditText不自动获取焦点。
    场景:有时候我们需要界面初始化时候并不希望EditText自动获取焦点,因为自动获取焦点会弹出软键盘,此种场景并不是我们所需要的,所以我们要设置让EditText不自动获取焦点
    解决方案:在EditText的父级控件中找一个,设置成
    android:focusable="true"      android:focusableInTouchMode="true"

    这样,就把EditText默认的行为拦截了。
    或者采用下面这种方式:

    EditText对象的clearFocus(); InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);  imm.hideSoftInputFromWindow(editMsgView.getWindowToken(), 0); //关闭软键盘
  2. Android 禁止初始时ScrollView自动滚动到底部。
    场景:用ScrollView,加载数据时如果数据超过一屏的高度,有时会出现ScrollView自动滚动到底部,可能不是我们所需要的,我们可能需要的是从顶部开始显示。
    解决方案:在ScrollView子标签LinearLayout里面加上:
    android:focusable="true"   android:focusableInTouchMode="true"

    如果出现某个控件抢占焦点造成的,可以禁止此控件的焦点。

  3. Android 软键盘弹出时把原来布局顶上去的解决方法。
    场景:键盘弹出时,会将布局底部的导航条顶上去。
    解决方案:在mainfest.xml中,在和导航栏相关的activity中添加如下代码:
    <activity android:name=".MainActivity" android:windowSoftInputMode="adjustResize|stateHidden" />

    扩展:

    【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置 【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示 【C】stateHidden:用户选择activity时,软键盘总是被隐藏 【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的 【E】stateVisible:软键盘通常是可见的 【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态 【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示 【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间 【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
  4. 在Android 6.0下继续使用HttpClient。
    HttpClient在Android 6.0已经被Google废除了,如果想继续使用HttpClient的话,只需在主Module的gradle中配置:
    android {    useLibrary ‘org.apache.http.legacy‘   }
  5. android 6.0以上运行时权限问题
    • 报错如下:
      java.lang.RuntimeException:  Unable to start activity ComponentInfo{com.liujc.supereader/com.liujc.supereader.ui.activity.ReadActivity}: java.lang.SecurityException: com.liujc.supereader was not granted  this permission: android.permission.WRITE_SETTINGS.
    • 解决方案:Android 中有两个特殊权限,使用requestPermission方法是不成功的,需要特殊设置
      • SYSTEM_ALERT_WINDOW
      • WRITE_SETTINGS
        关于这两个权限,需要我们自己手动开启系统设置的Activity界面。后来打开系统设置页面,才有这个权限的设置,设置下就ok了。
        友好方式就是检测到该权限获取失败,提示用户跳转到设置界面设置:
        • 设置弹框权限
          //权限申请相关方法 private static final int REQUEST_CODE = 1; private void requestAlertWindowPermission() {     Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);   intent.setData(Uri.parse("package:" + getPackageName()));  startActivityForResult(intent, REQUEST_CODE);              } //回调 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data);     if (requestCode == REQUEST_CODE) {         if (Settings.canDrawOverlays(this)) {                  Toast.makeText(this,"弹窗权限开启!",Toast.LENGTH_SHORT).show();                  PrefUtils.setBoolean(MainActivity.this, "isAllowAlert", true);          }else {                 PrefUtils.setBoolean(MainActivity.this, "isAllowAlert", false);             }     } }
        • 设置权限
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 判断是否有WRITE_SETTINGS权限 if(!Settings.System.canWrite(this)) {    // 申请WRITE_SETTINGS权限    Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS,            Uri.parse("package:" + getPackageName()));    startActivityForResult(intent, REQUEST_CODE); } else {    dosomething(); } } else { dosomething(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intentdata) { if (requestCode == REQUEST_CODE) {    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {        // 判断是否有WRITE_SETTINGS权限        if (Settings.System.canWrite(this)) {            dosomething();        }    } } super.onActivityResult(requestCode, resultCode, data); }
  6. 在使用toolbar时报以下错误:
    This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR
    主要问题出在我们配置的style中:
    错误写法:
    <style name="AppTheme.NoActionBar">      <item name="android:windowActionBar">false</item>      <item name="android:windowNoTitle">true</item>      <item name="android:windowDrawsSystemBarBackgrounds">true</item>      <item name="android:statusBarColor">@android:color/transparent</item>  </style>

    其中AppTheme使用的主题是AppCompat的主题,由于AppCompat主题下的windowActionBar和windowNoTitle的命名方式前都没有android字样,所以报错。
    正确写法:

    <style name="AppTheme.NoActionBar">      <item name="windowActionBar">false</item>      <item name="windowNoTitle">true</item>      <item name="android:windowDrawsSystemBarBackgrounds">true</item>      <item name="android:statusBarColor">@android:color/transparent</item>  </style>
  7. Android Studio导入项目报:错误: 非法字符: ‘/ufeff’。
    出现场景:
    复制的Eclipse项目的源文件粘贴到Android Studio上,在Android Studio上面编译运行报错:“错误: 非法字符: ‘/ufeff’”。
    原因:
    Eclipse可以自动把UTF-8+BOM文件转为普通的UTF-8文件,但AndroidStudio需要重新转一下 。
    解决办法:
    将编码格式UTF-8+BOM文件转为普通的UTF-8文件。

    • 简单方法,在AS右下角,将编码改为GBK,再转为UTF-8,可以解决。
      Android开发中小问题汇总(持续更新)

      这里写图片描述

    • 用EditPlus
      将文件用EditPlus打开,然后选择Document(文件),再选择Convert Encoding(编码转换)成UTF-8即可。将修改过编码格式的类,拷到项目中,覆盖原先的类。
  8. Android Studio出现Error:No service of type Factory available in ProjectScopeServices.
    出现场景:
    当你从第三方download一个项目时,可能用Android Studio去打开想运行下看看demo的运行效果,结果很不爽,碰到个error:No service of type Factory available in ProjectScopeServices.
    解决办法:
    定位到根目录(也就是Project)下的build.gradle文件中的buildscript —> dependencies中添加
    classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'编译下应该就OK了。
    具体如下:

    buildscript {  repositories {      jcenter()  }  dependencies {      classpath 'com.android.tools.build:gradle:2.2.3'      classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'   } }
  9. 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE
    出现场景:
    在Android模拟器上安装apk调试程序时,出现以下异常:
    Installation failed with message INSTALL_FAILED_NO_MATCHING_ABIS. It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing. WARNING: Uninstalling will remove the application data! Do you want to uninstall the existing application?

    调查原因:
    由于程序中使用了native libraries(也就是.so文件) 。该native libraries 不支持当前的cpu的体系结构。
    现在安卓模拟器的CPU/ABI一般有三种类型,INTEL X86,ARM,MIPS。
    解决方案:
    根据当前模拟器的cpu体系结构在程序目录中提供不同目录下的so文件,如果程序中只提供了ARM,出现INSTALL_FAILED_NO_MATCHING_ABIS的错误,那么久改用ARM,否则反之。再或者你全部添加,如下图:

Android开发中小问题汇总(持续更新)

image.png


软件使用链接:

  • 1.EditPlus注册码在线生成
  • 2.IDEA激活码在线生成
  • 3.抓包工具Charles的使用
    下载链接 http://charles.iiilab.com/
    如何截取分析 Https 协议相关的内容:
    1. 点击 Charles 的顶部菜单,选择 “Help” –> “SSL Proxying” –> “Install Charles Root Certificate”.
      Android开发中小问题汇总(持续更新)

      1.png

    2. 用手机在浏览器中打开http://charlesproxy.com/getssl 下载及安装证书。此时可以拦截http请求了,不过如果拦截https请求时,会出现乱码,那就接着往下看。
    3. 即使是安装完证书之后,Charles 默认也并不截取 Https 网络通讯的信息,如果你想对截取某个网站上的所有 Https 网络请求,可以在该请求上右击,选择Enable SSL Proxying,此时即可拦截手机的https请求数据。

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » Android开发中小问题汇总(持续更新)

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址