Android Studio开发中常见问题及解决(三)

来源:互联网 发布:sql update空值 编辑:程序博客网 时间:2024/06/05 04:24
1、解决IllegalStateException: Can not perform this action after onSaveInstanceState
问题出现在使用FragmentTransition的commit方法添加一个Fragment的时候。
大致意思是说我使用的 commit方法是在Activity的onSaveInstanceState()之后调用的,这样会出错,因为onSaveInstanceState
方法是在该Activity即将被销毁前调用,来保存Activity数据的,如果在保存玩状态后再给它添加Fragment就会出错。解决办法就
是把commit()方法替换成 commitAllowingStateLoss()就行了,其效果是一样的。


2、AppCompatActivity、ActionBarActivity、FragmentActivity和Activity的区别
package com.chy.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
/*
* support v4 FragmentActivity  兼容2.x模式下使用Fragment
* support v7 AppCompatActivity 兼容2.x模式下使用Fragment和ActionBar,ActionBarActivity是AppCompatActivity过时产品
* 如果3.0以上直接继承Activity,便可使用Fragment和ActionBar
*/
public class MainActivity extends AppCompatActivity {
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
Activity 发展到3.0(大概)之后,可以使用fragment了,但是support v4 提供了1.6~3.0的fragment兼容,所以如果需要用兼容版的fragment,则需要继承support v4提供的FragmentActivity。
而后一点点时间之后,3.0(大概)出现的ActionBar也被向前支持了,这次是出现在support v7里,如果需要使用兼容版的actionbar,则继承support v7提供的ActionBarActivity(它是继承FragmentActivity的)。
再然后也就是去年年底到今年,5.0提供了很多很多新东西,于是support v7也更新了,出现了AppCompatActivity , 具体功能请自行查找。


3、解决Android Studio Gradle错误(提示错误:“错误: 编码 GBK 的不可映射字符”)
 
解决方法:
在项目下的build.gradle下添加以下代码即可解决。
tasks.withType(Compile) {  
    options.encoding = "UTF-8"  



radle2.0+环境下需将Compile改为JavaCompile。
tasks.withType(JavaCompile) {  
    options.encoding = "UTF-8"  
}

 


4、Android4.4出现:java.lang.NoClassDefFoundError: android/os/PersistableBundle


@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
    super.onCreate(savedInstanceState, persistentState);
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    super.onSaveInstanceState(outState, outPersistentState);
}

改写成如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
}
注意在写Activity的时候,如果使用了public 两个Bundle参数的方法,那么在4.4的机器上就会出现crash的情况!
所以要记得是复写protected开头的回调方法。


5、Ignoring InnerClasses attribute for an anonymous inner class

(1) 第一考虑是不是可以直接忽略第三方的属性的错误警告,由此层层递进发现问题。
(2) 出现Ignoring InnerClasses attribute for an anonymous inner class问题一般是第三方jar的问题引起的可能性很小,首先考虑是不是Dex越界问题。
(3) 将keepattributes EnclosingMethod去除,再次重构发现也不会出现Ignoring InnerClasses attribute for an anonymous inner class问题,由此进一步推断主要是Dex越界问题引起Ignoring InnerClasses attribute for an anonymous inner class问题。如果导入项目遇到类似问题首先判断是否是Dex越界引起。
查找相关资料,资料显示每个项目的Dex都有方法数的限制(上限65536,超过上限号称应用爆棚),由此猜想会不会是Dex的方法数超过上限呢?同样报着试试的态度,在项目的build.gradle文件中添加multiDexEnabled true代码(解释:设置多Dex可用)。

以下是第二种解决方案,经过很多遍的测试和在网上查找了资料,找到了如下的解决办法:
1、在proguard-rules.pro文件中加入混淆代码  -keepattributes EnclosingMethod
2、在gradle中加入
defaultConfig {
        multiDexEnabled true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        signingConfig signingConfigs.debug
}
 buildTypes {
        release {
            multiDexEnabled true
            minifyEnabled true
            //移除无用的资源文件
            shrinkResources true
            zipAlignEnabled true
            debuggable false
            jniDebuggable false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }