安卓开发过程中遇到问题总结二

前提是你 提交于 2019-12-03 22:10:41

1.android 自定义view报如下错误:java.lang.IllegalStateException: Underflow in restore

原因:在自定义view里面调用了如下方法来保存画布的bitmap图像;
mCanvas.restore()

解决方法:改成:
mCanvas.save();
mCanvas.restore();
Okay!解决!

2.使用Intent传递数据量大时(尤其是bitmap对象),app没反应?

android四大组件之间Intent传递数据,数据不能过大,基本要小于1M,不然会导致程序黑屏,ANR.

3.this.requestWindowFeature(Window.FEATURE_NO_TITLE);代码中去掉标题栏使用时报错?

当我们的Activity是继承自Activity或者是FragmentActivity时不会有问题;但当我们继承的是AppCompatActivity时就会报错,

解决方法是 getSupportActionBar().hide()或者是这是主题为Theme.AppCompat.Light.NoActionBar;

4.在使用第三方库经常报有一些v4,v7包冲突问题?

在封装library的时候,尽量不要引入第三方包,v4,v7等自带的包也是一样尽量不要引入,避免以后工程依赖的时候,包或者包内文件产生冲突。
对于冲突的包,改成一样的就可以解决了。

5.Can’t load native library.CPU arch invalid for this build?

CPU_ABI : armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips, mips64.
复制你的.so文件到/libs/(armeabi|armeabi-v7a|x86|…)
Android Studio复制到jniLibs文件夹下,eclipse 复制到libs文件夹下。
注意当你使用多个第三方库的时候时,而且这些库有使用.so文件,创建文件夹时应保证【最少原则】。

比如:一个库中.so文件支持armeabi,armeabi-v7a,x86,另外一个库却只支持armeabi-v7a这样也会造成该问题的产生,因为支持x86的机器会在另一个库中找不到.so文件而保错。

6.Android应用第一次安装成功点击“打开”后Home键切出应用后再点击桌面图标返回导致应用重启问题

/*在应用程序设置<action android:name="android.intent.action.MAIN" />应用程序入口Activity的onCreate方法中加入上面的判断,完美解决应用程序多次重启问题。
*/
if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0){
   finish();
   return;
}

7.Fragment中的setUserVisibleHint不执行?

1.viewpager+fragment模式setUserVisibleHint()方法是执行的,其中第一个fragment的该方法执行两次,第一次在onAttch()方法执行之前,第二次在onCreate()方法执行之后,在onCreateView()方法执行之前。当我们把fragment缓存起来时,该方法还是会执行的。
2.当我们自己切换fragment时,transition.add(R.id.main_content, mainFragment);(获取用replace),fragment 中的setUserVisibleHint()是不执行的。

8.去掉actionBar的阴影

android5.0以下版本修改style.xml添加以下代码:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:actionBarSize">40dp</item>
     <!--下段代码就是去除阴影的-->
    <item name="android:windowContentOverlay">@null</item>
</style>

同时为了兼容5.0以上版本,需要在java代码中编写:

 //以下代码用于去除阴影
    if(Build.VERSION.SDK_INT>=21){
        getSupportActionBar().setElevation(0);
    }

9.token null is not for an application

android.view.WindowManager$BadTokenException: Unable to add window – token null is not for an application

导致报这个错是在于new AlertDialog.Builder(mcontext),虽然这里的参数是AlertDialog.Builder(Context context)但我们不能使用getApplicationContext()获得的Context,而必须使用Activity,因为只有一个Activity才能添加一个窗体。

解决方法:将new AlertDialog.Builder(Context context)中的参数用Activity.this(Activity是你的Activity的名称)来填充就可以正确的创建一个Dialog了。

10.getDrawable()方法好像就过时了

现象:
这里写图片描述
谷歌解决方案:
这里写图片描述

11.默认文字只在android studio 编辑时显示,而在真机运行时不显示,避免加载数据时的不友好展示呢?

解决方法:

根布局添加属性:

xmlns:tools=”http://schemas.android.com/tools”

textview添加属性:

tools:text=”默认文字”

这样就可以在android studio编辑时显示默认文字,以便直观看到布局,又避免在真机运行时显示默认文字影响用户友好设计。

12.Android api23中删除HttpClient的相关类的解决方法

我把api升级到23后,编译发现在NetCenter.java中有几个错误,如下图所示:

这里写图片描述
解决方法

1 把api降级,这对于我是不能忍受的
2 既然废除了,总会留下痕迹,果然,在sdk里留给了我们一个jar包

这里写图片描述
只要把该jar包导入就ok了,最好同步或者clean下,哈哈!
3 发现了新东西,gradle脚本里添加:

android {
    useLibrary "org.apache.http.legacy"
}

14.android studio 在项目clean时候出现v-7下的.9图片出错

github上下载导入的项目clean就出错了,显示的错误信息是在windows 下图片路径的字节不能超过240
解决办法:
把工程的名字写短点就好了。

15.dialog常见问题

最近在做项目的时候, Dialog的show以及dismiss导致程序crash,出现的问题是传递进来的Activity被finish或者重建(横竖屏切换)了。下面分别对这两种情况说明以及解决办法。
创建时候:

我们知道所有的窗口创建和管理都是依附于window manager的,因此Dialog的创建也不例外。Dialog的创建流程通过查看源码可以知道,在Dialog的构造函数中,创建了一个Window对象,但我们知道Window对象并不是用于显示的,真正用于显示的是View对象。因此通过Dialog的show方法构造了一个mDecor的View对象,并最终通过WindowManager的addView()方法显示Dialog,如果此时你的activity应为某种原因被finish或者重建就会出现此问题。

显示时候:

mDialog.setCancelable(false);
mDialog.setOwnerActivity(this);
  • 在Dialog.show时出现crash
 if ( mDialog != null ) {  
    Activity activity = mDialog.getOwnerActivity();  
    if ( activity != null && !activity.isFinishing() ) {  
        mDialog.show();  
    }  
} 
  • Dialog.dismiss时出现crash

    原因:Dialog在dismiss得时候是通过直接从WindowManager remove操作来完成的。当Activity被销毁后,此时的Dialog处于游离状态,在remove的时候会迭代,如果发现此View没有在数组mViews中时讲抛出IllegalArgumentException(“View not attached to window manager”)异常。

    解决办法:

创建Dialog的时候设置该Dialog所属的Activity,在dismiss的时候根据此activity的状态来决定是否dismiss此dialog

    if ( mDialog != null && mDialog.isShowing()) {  
        Activity activity = mDialog.getOwnerActivity();  
        if ( activity != null && !activity.isFinishing()) {  
            mDialog.dismiss();      
        }  
    }  
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!