在Android中使用意图启动活动 - 为什么这样做?

时间:2012-02-07 11:13:01

标签: android android-activity android-intent manifest

以前我一直在查看现有代码,以便在标签中显示地图,这次我试着自己写一下,看看我是否理解它。

它运行良好而没有错误(screenshot),但我不完全理解为什么,以及我是否以最佳方式执行此操作。

我不太明白的部分是在清单中。 我本以为android:label应该是maptabview_name,但是这给了我一个错误,说没有找到匹配的资源。

为什么在为该活动使用app_name时会运行? 为什么找不到maptabview_name资源?

另外,在MapTab2中,这是启动意图的最佳方式吗? 究竟是什么告诉系统? “我打算从这堂课开始一项活动”?

这是我的代码 (它基于this):

MapTab2.java

package com.test.maptab2;

import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TabHost;

public class MapTab2 extends TabActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Intent i = new Intent(this,MapTabView.class);

        TabHost.TabSpec spec;

        spec = getTabHost().newTabSpec("tab1");
        spec.setContent(i);
        spec.setIndicator("Map");
        getTabHost().addTab(spec);

        spec = getTabHost().newTabSpec("tab2");
        spec.setContent(R.id.detailstub);
        spec.setIndicator("Detail");
        getTabHost().addTab(spec);

        getTabHost().setCurrentTab(0);

    }

}

MapTabView.java

package com.test.maptab2;

import android.os.Bundle;
import com.google.android.maps.MapActivity;

public class MapTabView extends MapActivity {

    @Override
    public void onCreate (Bundle icicle){
        super.onCreate(icicle);
        setContentView(R.layout.maptabview);
    }

    @Override
    public boolean isRouteDisplayed(){
        return false;
    }

}

main.xml中

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

        <!-- Tab-switch panel -->
        <TabWidget android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>

        <!-- Tab contents -->
        <FrameLayout android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">

            <!-- Map here -->
            <RelativeLayout android:id="@+id/mapstub"
                android:orientation="vertical"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"/>

            <!-- Other stuff -->
            <TextView android:id="@+id/detailstub"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="detail"/>

        </FrameLayout>  
    </LinearLayout>
</TabHost>

maptabview.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/maptablayout"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.google.android.maps.MapView android:id="@+id/mapview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true"
        android:apiKey="0HRMcD5o6WrBVhmwbWpeyeavZ67PXWOvJeeCx2g"/>

</RelativeLayout>

MapTab2.Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.maptab2"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="3" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >

        <uses-library android:name="com.google.android.maps" />

        <!--  Main  -->
        <activity android:name=".MapTab2"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!--  Map  -->
        <activity android:name=".MapTabView"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.EMBED" />
            </intent-filter>
        </activity>

    </application>
</manifest>

1 个答案:

答案 0 :(得分:0)

Q1:maptabview_name必须位于字符串资源文件中,通常位于res/values/string.xml,以防您拥有它并且仍然不在资源生成文件(gen/package/R.java)中,尝试删除它,让eclipse再次生成它。

Q2:AFAIK,TabHost.TabSpec.setContent(Intent intent)就像在指定标签中启动活动一样。我认为这是处理标签时的方法。由于Intents用于执行很多操作,因此这是一个基本用法,在这种情况下只是为了指定类。