Android学习中遇到的问题及解决方案

1.搭建开发环境时遇到的问题

初装Android Studio,首次运行报错:Error running app: Instant Run requires ‘Tools | Android | Enable ADB integration’ to be enabled.
解决方案
根据提示,勾选Tools | Android | Enable ADB integration
ADB(Android Debug Bridge),起到调试桥的作用。ADB采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯。ADB是android SDK里的一个工具, 可以直接操作管理android设备。
其主要功能:
* 运行设备的shell(命令行)
* 管理模拟器或设备的端口映射
* 计算机和设备之间上传/下载文件
* 将本地apk软件安装至模拟器或android设备

2.运行时遇到无法实例化Activity的错误

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo
java.lang.NullPointerException:Attempt to invoke virtual method ‘android.view.Window$Callback android.view.Window.getCallback()’ on a null object reference
错误原因以及解决方案
经Google得到的回答:An Activity is not fully initialized and ready to look up views until after setContentView(…) is called in onCreate().
      setContentView(R.layout.activity_main)表示设置当前Activity采用R.layout下的activity_main布局文件进行布局。当activity 调用 setContentView() 时,android 才会去绘制 layout 上的各个元素,并为其分配内存。只有分配了内存以后,才能继续执行findViewById(),才能得到引用,不然得到空引用,即意味着,后面使用相应变量时就会发生访问的对象不存在的问题。当Activity重新setContentView()以后,那些之前绘制的控件的内存都被灭掉了。故需注意,若是通过setContentView 来达到画面切换目的的,重新绘制后要重新取得引用。
      总之,没有setContentView(第二个界面)之前,第二个界面里的元素虽然能找到,AS没有报错,但因没被分配内存,所以在onCreate这里为第二个界面绑定监听是错误的!运行的时候程序会直接挂掉。
      记住:setContentView之后才为布局里的元素分配内存,在未分配内存前对元素进行访问时没有意义的!

3.Activity跳转后布局界面空白

在Activity界面编辑代码时,打出onCreate随手回车,setContentView之后却无法显示布局界面,出现空白界面。
错误原因以及解决方案
使用了以下onCreate方法

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

PersistableBundle:A mapping from String values to various types that can be saved to persistent and later restored.即PersistableBundle是一个可以持久保存并且可以恢复的Bundle.
错误检查方法:可以在onCreate中采用Log.i();打印信息,进行调试。以上的onCreate方法只有一些突发异常情况才会触发它们,比如横竖屏切换、按Home键等。

关于重载的onCreate函数:

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
}
  1. super.onCreate(savedInstanceState)是指调用父类的onCreate构造函数。
  2. savedInstanceState参数是保存当前Activity的状态信息。当一个Activity的生命周期结束前,会调用该方法保存状态。
  3. Bundle类型的数据与Map类型的数据相似,以key-value的形式存储数据。
  4. saveInsanceState参数是指保存实例状态即保存Activity(活动)的状态。
@Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
    }
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onRestoreInstanceState(savedInstanceState, persistentState);
}
@Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
    }

三种方法结合使用并在注册该Activity时候添加属性android:persistableMode=”persistAcrossReboots”,这样就可以给你的Activity存储一些持久化数据。当你的手机重启或者发生其他意外情况的时候,也可以给你的页面获取到相关数据。

4.更新后发生的那些事儿

今天更新完Android Studio打开以前Gradle为2.10的Project时发现了如下错误:
error
具体的问题没有调查清楚,不过倒是找到了解决办法。
问题的原因个人认为是Gradle没有自动更新,应该随便改个版本都行,我的Android Studio改完之后会提示让我把Gradle更新到2.2.2,然后就好了。
解决的办法:
可以暂时的将Gradle降为2.14.1 就可以了
File->Project Structure->Project,保存,更新。

5.Socket deconnection

以前一直没仔细看Logcat,今天调试学习的时候突然发现Logcat中输出了好多条Socket deconnection,头一回见到deconnection这个单词,查了下Collins,尴尬的是没发现这个词。。。于是根据前缀de加第六感,应该是端口断开了,于是看了下任务管理器,发现有三个adb.exe进程,均来自android sdk.原来是Genymotion和Android Studio共用了一个sdk,解决的方法就是:不要让他们共用一个sdk.

6.Menu items should specify a title


<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:android="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      tools:context="com.ryan.game.MainActivity" >
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/action_setting"/>
menu>

从Stackflow上找的解决方案:

try to follow Goolge dev examples here http://developer.android.com/guide/topics/ui/menus.html
on the google dev examples they changed the android:showAsAction to app:showAsAction


<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      tools:context="com.ryan.game.MainActivity" >
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        app:showAsAction="never"
        android:title="@string/action_setting"/>
menu>

你可能感兴趣的:(Android学习中遇到的问题及解决方案)