在学习 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>