Android常见问题及开发经验总结(一)

926 阅读5分钟

​​携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情 >>

自己在开发过程中碰到的一些错误 及 一些经验总结,主要针对一些刚开始步入开发行业的新人,大神可直接忽略此贴。给开发新人提供一些经验介绍!

从最简单的问题开始来说:

1.R文件缺失 找不到R文件

​编辑

查看res中资源文件,图片,xml等。

1)比如图片文件名不能有大写不能有空格。2)xml中不能有错误 xml中有错误 记得不要clean项目 一旦clean 所有的类中都会报错显示找不到R文件 最后搞定错误之后 Project->clean就可以了。

2.空指针异常

​编辑

这个最常见 最初级 但是好多人还是会犯的一个错误。

1)变量为空 2)控件view为空 这个都是因为没有初始化 的原因。

举两个简单的例子: String str; str.equals("s"); //没给str赋值 直接使用 str还是null

Button sButton; sButton.setText(""); //没有初始化sButton sButton 还是null

3.ClassNotFoundException Didn't find class "xxx.xxx.xx" 找不到对应的类

​编辑

这个是因为新加的activity需要在 AndroidManifest.xml 里面注册一下这个类 不然就会报这个异常。

4. java.lang.ClassCastException: 类型转换错误

​编辑

这个是因为 类型转换错误,举个例子 将button 转换为 EditText LinearLayout 转换为RelativeLayout的时候都会报这个异常

只需要检查程序中变量或者 view的 类型就可以

5.java.lang.IndexOutOfBoundsException用非法索引访问数组时抛出的异常

​编辑

这个在Android中一般在 适配器adapter里面容易出现 ,这个地方一般会产生数据交互。出现这个错误一般直接检查 数据层就可以了。

像这些简单的错误 在后台日志中都可以定位到 当前出现错误的类和第几行 直接找到对应的 检查改掉就好了。

6.java.lang.SecurityException 缺少权限异常

​编辑

这个异常 原因 是没有在AndroidManifest.xml 里面注册相应的权限 看缺少哪个权限 注册一下就ok了!

写法类似这样 具体缺少哪个权限 改成对应的名字就好

6.android library cannot be launched

点击运行的工程右键出现Properties,

​编辑

点击Properties,进入把is library 前的对勾去掉

​编辑

然后重新运行就ok了。

下面介绍一些Android开发中一些常用的经验技巧

1.自定义title栏。

首先要在values->styles中定义一个style,然后在mainfest文件中设置android:theme.
最后在Activity中按照这个顺序写:
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.activity_main);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title_layout);

2.imagView居中显示问题

xml设置如下:

<LinearLayout xmlns:android="schemas.android.com/apk/res/and…"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/myImageView"
android:layout_gravity="center"
android:scaleType="matrix"
android:src="@drawable/pic" >

3.去掉Activity的标题栏,全屏显示

在manifest文件中修改对应的Avtivity属性。
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

4.如何修改应用名称及应用图标

修改程序的图标,修改drawable文件夹的i→→c_launcher.png图标,把新的图标改名覆盖就可以了。
如果你要自己的名称,可以修改AndroidManifest.xml的这个节点,application android:icon="@drawable/ic_launcher",不需要加文件扩展名。
ps:有些手机 比如 红米1s 。之前手机安装过程序 然后修改程序图标以后需要重启手机 才能看到修改后的图标。( 应该是手机系统的问题)!

5.调试程序

调试的时候程序如果出错,一般是查看logcat,看error发生的地方,会提示在程序的第几行,然后去找就可以了。
但有些错误没办法定位,那就把日志输出成txt,然后去google,baidu吧。

6.有点击效果的button 设置样式的方法。

首先是准备好按钮不同状态的图片
然后 在res/drawable中定义selectorBtn.xml的xml文件

最后Button的background属性中设置

7、requestCode和resultCode的区别

在使用startActivityForResult()和onActivityResult()时,会分别用到requestCode和resultCode,有时候极容易将2个参数混淆起来。

requestCode 和 resultCode 混淆说明错的。

startActivityForResult(Intent intent, Int requestCode)

intent 传给B的,requestCode >=0就好,随便用于在onActivityResult()区别哪个子模块回传的数据,如果还有C.java ,D甚至E子模块的话,每个区分开不同的requestCode就好。

setResut(int resultCode, Intent intent)

resultCode 如果B子模块可能有几种不同的结果返回,可以用这个参数予以识别区分。这里还有个特殊的 RESULT_OK 值,没有特殊情况用它就好了。intent 继续不解释,传回给A的onActivityResult()

onActivityResult(int requestCode, int resultCode, Intent intent)

这里三个都不用解释了,与上文对应的东西。如果不对requestCode和resultCode 加以识别区分的话,只要有其他activity setResult到了A onActivityResult()会无差别处理。

8、在布局中使用scrollview 实现布局可以滚动效果 (滚动条):

把原来的布局用<ScrollView xmlns:android="schemas.android.com/apk/res/and…"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="none">括起来即可实现视图的滚动。

9、全局变量Application Context

创建一个属于你自己的android.app.Application的子类,然后在manifest中申明一下这个类,这是android就为此建立一个全局可用的实例,你可以在其他任何地方使用Context.getApplicationContext()方法获取这个实例,进而获取其中的状态(变量)。 下面看一下Demo:

class MyApp extends Application {

private String myState;

public String getState(){

return myState;

}

public void setState(String s){

myState = s;

}

}

class Blah extends Activity {

@Override

public void onCreate(Bundle b){

...

MyApp appState = ((MyApp)getApplicationContext());

String state = appState.getState();

...

}

}

这个效果就是使用静态变量是一样的,但是其更符合android的架构体系。 使用这种方法的话需要在AndroidManifest.xml中配置一下:

<application android:name=".MyApp"

android:icon="@drawable/icon"

android:label="@string/app_name">