在学习 Android Pro 4期间遇到了些问题,这些问题都是低级错误,在网上搜索也容易获得解决办法。作为初学,还是记录下这些低级错误的解决方法,希望对他人有益。
1. 第五章,学习使用Intent。在调用以下拨号应用中,发生了错误。
public static void call(Activity activity) { Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:555-555-5555")); activity.startActivity(intent); }
问题是需要在androidmanifest.xml中添加对拨号操作的许可,如下。
<uses-permission android:name="android.permission.CALL_PHONE"/>
2. 第五章,学习使用Intent。在调用打开网站的应用中,发生了错误。
public static void invokeWebSearch(Activity activity) { Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); intent.setData(Uri.parse("www.google.com")); // 错误 activity.startActivity(intent); }
问题是URI依赖起始的格式信息(scheme),如果没找到正确的格式信息,Uri将不能正确选择正确的应用。一般来说,ACTION_WEB_SEARCH关乎"http:","https:",ACTION_CALL 关乎“tel:”,地图坐标定位关乎“geo:”,根据应用不同,不排除其他组合,具体参考http://developer.android.com/reference/android/content/Intent.html。代码修改后如下。
public static void invokeWebSearch(Activity activity) { Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); intent.setData(Uri.parse("http://www.google.com")); // 正确 activity.startActivity(intent); }3. 第五章,学习使用Intent。在调用如下地图导航应用时,发生错误
public static void showMapAtLatLong(Activity activity) { Intent intent = new Intent(Intent.ACTION_VIEW); //geo:lat,long?z=zoomlevel&q=question-string intent.setData(Uri.parse("geo:0,0?z=4&q=business+near+city")); activity.startActivity(intent); }后来在网上找到一篇博文,解释了这种情况是模拟器不支持造成。于是用以下代码来做分支,在模拟器上就临时用网页提供功能。
private static boolean isEmulator() { return (Build.MODEL.equals("sdk")) || (Build.MODEL.equals("google_sdk")); } public static void showMapAtLatLong(Activity activity) { Intent intent = new Intent(Intent.ACTION_VIEW); //geo:lat,long?z=zoomlevel&q=question-string if( isEmulator() ) { intent.setData(Uri.parse("http://maps.google.com/?q=0,0?z=4&q=business+near+city")); } else { intent.setData(Uri.parse("geo:0,0?z=4&q=business+near+city")); } activity.startActivity(intent); }
4. 第六章,学习使用控件。使用ListView
创建一个新的布局文件 res \ layout \ myListView.xml,并使用下面代码,报错“Invalid file name: must contain only [a-z0-9_.]”。原因是资源文件名都要符合正则表达式“[a-z0-9_.]”,即只能包含字母a-z、数字0-9、"_"与"."。
public class UIuseXMLActivity extends ListActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.main); setContentView(R.layout.myListView); // 错误 略。。。改成小写 mylistview.xml 即可。
5. 第六章,学习使用控件。使用ListView
使用上一节的Activity类型UIuseXML,它继承ListActivity,而不是通常的Activity。同时创建一个新的布局文件 res \ layout \ mylistview.xml,在这个文件里添加ListView控件,如下。
<?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@+id/listview1" // 错误 android:layout_width="match_parent" android:layout_height="208dp" > </ListView> </LinearLayout>并使用下面代码,报错“ must have a ListView whose id attribute is 'android.R.id.list'”。原因是ListActivity内需要这个android内置资源id,因而修改如下。
<?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@android:id/list" // 正确 android:layout_width="match_parent" android:layout_height="208dp" > </ListView> </LinearLayout>