视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Android开发问题汇总
2025-10-03 14:47:34 责编:小OO
文档
Android开发问题汇总

注:Android 5.0的问题总结在这个帖子里。

1、用(SDK starter package)的installler安装Android SDK时提示无法找到JDK,但实际上机器上已经安装了JDK。

一个对不少人有效的解决方法是看到此提示时先点一下“回退”按钮,再点“下一步”,就会发现JDK被找到了。参考链接 

但在我机器上这个方法不起作用。所以我选择不使用installer,而是下载zip格式的文件,解压缩后运行SDK Manager.exe即可。参考链接

2、在Eclipse里新建一个Android项目,运行/调试时提示“Could not find xxx.apk!”

网上提到的大部分解决方案是clean整个项目,或选fix project properties菜单项。但对我的环境不起作用。

升级到Eclipse 3.7后,新创建的android项目在Build阶段报告一个异常“sun/security/x509/X500Name”,怀疑与所用的jdk(IBM JDK6)有关。果然,卸载IBM JDK并安装SUN JDK后问题解决。

3、让程序适应不同的屏幕分辨率

可参考这个链接:Android屏幕分辨率问题。

4、在android模拟器里用10.0.2.2可访问宿主机。

5、在setWidth()方法里指定的宽度是以pixel为单位的,如何转换为使用dip(device independent pixels)为单位?

使用下面的代码,参考链接 

 // Converts 14 dip into its equivalent px

Resources r = getResources();

float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 14, r.getDisplayMetrics());

6、弹出式对话框的用法,这个链接介绍得比较详细。 

7、导出apk文件时需要签名,这个链接比较详细。 

8、android界面设计原则,参考这个链接。

9、使用merge(而不是layout)可以达到在避免重复写layout的同时减少layout的数量。 

10、真机USB调试比用AVD调试快得多,设置也很简单,见这个链接。不过10.0.2.2不能用了,真机可以通过wifi访问局域网内的服务器。 

11、android-ui-utils,一个不错的在线Android图标生成器,地址在此。 

12、调试时如果出现莫名其妙的空指针错误,例如findViewByID()返回null,先试试clean一下整个project,通常都能解决。 

13、让ListView里无数据时显示一行信息。 

参考链接,注意ListView和TextView的id。

14、用自己的图标替换ListView里的RadioButton

在用作row的layout里添加一个图片,在java code里覆盖adapter的getView()方法,根据ListView的getCheckedItemPosition()结果设置图片的可见性。注意不要通过setOnClickListener()方法设置view里的图片可见性,因为ListView只维护可见的那些row控件,这样做会导致很奇怪的结果(点第一条记录结果第二条记录被选中,并且滚动ListView时选中状态还会随机变化,见此链接)。

另外一个办法是通过设置checkMark为所需要的图标,可能是更简单的解决方案(还没试)。 

Update: 以上结果基于对ListView实现不了解的情况,其实使用RadioButton是可以实现的,见#22。 

15、ListView的selection和choice是完全不同的,所以不要指望ListView#clearChoice()能清楚你已经是checked状态的那些item。

16、屏幕方向变化时(横屏->竖屏,或反过来),ListView里发生变化的内容丢失,状态回到开始时的样子。

当屏幕方向发生变化时,android会重建整个Activity以便你构造更适合某个方向的UI。为了避免这种情况,在AndroidManifest.xml里的那个Activity声明上增加android:configChanges="orientation" 即可。详见参考链接。

17、各手机平台仿真器/模拟器的下载链接。

18、AlertDialog#show()方法是不会阻塞当前线程的。 

19、让不同Activity之间进行通信,例如一个TabActivity里有多个Activity,它们之间需要传递一些消息。

可使用BroadcastReceiver机制。 参考链接。要注意的是,tab还未启动时是无法接收到消息的,所以要在tabhost所在的activity里也接收消息,当tab启动时传给它。

20、Android SDK里的style和theme文档

见此链接。 

21、Tab的样式。

Android的tab样式问题比较多,不同版本的样式也不一样。这里有一个自定义样式的参考链接。

22、在ListView里使用单选/复选按钮。

问题很多,这个链接看起来解决了问题,但在我的环境里没试验成功。

Update: 以复选按钮为例,本质的问题在于ListView里的复选按钮不知道对应的model是哪个,需要事先用CheckBox#setTag(myModelObject)关联,onclick事件里用getTag()改变其选中状态。建议看这篇文档。 

23、strings.xml里定义的字符串里增加参数。

在字符串里用“%1$s”、“%2$d”表示参数的序号和类型,然后用String.format()方法赋值。参考这个链接。

24、嵌入条码/二维码扫描功能

使用zxing。方法是在手机上先安装BarcodeScanner.apk,然后在程序里调用其提供的Activity,该Activity会返回扫描结果。 参考链接

25、改变ListView里每个Row的背景颜色

直接在getView()里写view.setBackgroundColor()是不行的。正确的方法是先在drawable目录里建一个xml文件,自己起名如my_row.xml,内容如下(关键是第一个和第四个):

android:drawable="@android:color/transparent"/>

android:drawable="@android:color/transparent"/>

然后在getView()里这样写就可以了:

if (item.getStopId().equals(User.stopId)) {

view.setBackgroundResource(R.drawable.my_row);

} else {

view.setBackgroundResource(android.R.drawable.list_selector_background);

}

参考链接1 参考链接2 参考链接3

26、在一个TableLayout里让Button宽度相同并占满表格宽度(想象一个由按钮组成的九宫格)

如果Button上的文字不长,按一般的方法就可以实现,例如这个链接。当Button上的文字很长,还是会使布局变乱,每个列的长度将不一样。解决方案是将按钮的layout_width设为0,layout_height设置为所需要的值,需要换行时将singleLine设置为false,最后将按钮的gravity设置为center。

27、对切换屏幕方向的处理 

参考stackoverflow上的一个典型讨论。 

当MyActivity位于一个TabActivity里时,我做了一些实验表明,TabActivity是否声明android:configChanges="keyboardHidden|orientation"与MyActivity无关,只有MyActivity做了上述声明后才会在改变方向时触发onConfigurationChanged()方法。

28、strings.xml里的字符串包含html格式标签时

需要用把html代码包起来。参考链接 

29、在AlertDialog里用ListAdapter(如ArrayAdapter)时,文字不显示。

view的resourceId要用select_dialog_singlechoice而不能用simple_list_item_single_choice,否则文字颜色会与背景颜色相同而无法显示。参考链接

30、在android程序里使用第三方包的配置方法 

参考这个链接成功。 

31、定制tabhost的外观

这方面的需求和问题网上都很多,主要的解决方案有基于tabhost的和基于radiobutton的两大类,这里有几个可以参考的链接。链接1,链接2,链接3 

32、取得当前屏幕方向

有好几个方法可以得到orientation值,但一些得到的值不对,例如getWindowManager().getDefaultDisplay().getOrientation()和getReqestedOrientation()。我实验下来比较靠谱的是getResources().getConfiguration().orientation。 

33、Activity里第一个View是EditText的时候,软键盘自动弹出。

似乎只是一些机型会这样做。要阻止软键盘弹出,可在onCreate()里加一行代码。参考链接 

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

34、Dialog的theme问题

使用Theme.Light主题时,Dialog显示不正常。相关讨论:链接1,链接2

35、注意区分CheckBox和RadioButton的OnClickListener和OnCheckedChangeListner

使用前者时,当在代码里执行myCheckBox.setChecked(true),不会触发事件,而后者会触发事件。

36、监视GPS开启/关闭事件 

用GpsStatus.Listener不可靠(事件不上来),这个链接的方法是监视Settings里的事件:参考链接

37、仿真器横屏

快捷键ctrl+f11。有人提到ctrl+f12和numpad 7也可以,但我这里不起作用。

38、用JAXB生成KML对应的Java Code时会遇到一些问题,解决方法如下:

1)写一个binding文件如bindings.xjb放在与ogckml22.xsd同一目录,内容可参考这个链接(根据错误提示要删除几行)

2)在命令行里加-extension

3)在命令行里加-target 2.1(否则生成的java类的annotation带有jdk6不识别的关键字"required")

完整的命令行如下:

xjc -xmlschema -verbose -extension -b bindings.xjb -d src -target 2.1 ogckml22.xsd 

39、ListPreference的entryValues只能使用string-array

如果使用了integer-array,在点击这个preference项时会产生一个空指针异常,相关讨论见链接1、链接2。

Update: 又发现一个ListPreference的新问题,即使用string-array,defaultValue值也不能取太大的(超过Integer.MAX_VALUE)整数,否则defaultValue不起作用(选项没有缺省被选中)。真是问题多多。android版本2.2。

40、Android提供了方便的Share机制,但一般都是把文字share到微博或SMS,如何能"share"文字到SD卡文件呢? 

这个链接描述了同样的问题,等待有人回答。目前的想法是,在程序里自己实现一个接受ACTION_SEND的activity,做法可参考此链接、或此文章。

41、一个在线查看kml文件的网站,供参考。

GPS Visualizer 

42、关于onSaveInstanceState()的使用

通常与onCreate()配合,而非onRestoreInstanceState(),参考这个链接。

2015/5/18补充:一个误区是onSaveInstanceState()方法是当activity被系统销毁时才调用,其实是当activity“变得容易被系统销毁”时就会被调用,例如当按下home键时,此时activity不再在前台显示,也就变得容易被销毁了。参考链接,参考链接2

43、ListView里点击一个item背景色不变为橘黄(缺省的反馈颜色),各种OnClick事件不被触发。

一种可能是在item的布局文件(如foo_list_row.xml)里使用了下面的这些属性(自动滚动显示文字时常会用到),去掉后即可恢复正常:

android:ellipsize="marquee" android:scrollHorizontally="true"

android:marqueeRepeatLimit="marquee_forever" android:focusable="true"

android:focusableInTouchMode="true" 

44、实现不停向上滚动的ListView

假设你有一个长长的list需要自动展示,方式是每隔几秒向上滚动一行,有点类似TextView的marquee功能(跑马灯?)。这个需求可以通过Handler实现,具体参考这个链接;当列表滚动到最后一行时,直接滚回第一行显得很生硬,可以用这个链接里提供的方法解决。

45、在Button的文字旁加图片

显示全文
专题