您的位置:首页 > 移动开发 > Android开发

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

2016-10-10 22:34 323 查看

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);
}


super.onCreate(savedInstanceState)是指调用父类的onCreate构造函数。

savedInstanceState参数是保存当前Activity的状态信息。当一个Activity的生命周期结束前,会调用该方法保存状态。

Bundle类型的数据与Map类型的数据相似,以key-value的形式存储数据。

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时发现了如下错误:



具体的问题没有调查清楚,不过倒是找到了解决办法。

问题的原因个人认为是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

<?xml version="1.0" encoding="utf-8"?>
<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

<?xml version="1.0" encoding="utf-8"?>
<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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: