Начало деятельности с намерениями в Android - почему это работает? - PullRequest
1 голос
/ 07 февраля 2012

Раньше я искал существующий код для отображения карты во вкладке, и на этот раз я попытался написать ее сам, чтобы понять, понял ли я ее.

Он работает без ошибок ( снимок экрана ), но я не до конца понимаю, почему и делаю ли я это наилучшим образом.

Часть, которую я не совсем понимаю, находится в манифесте. Я бы подумал, что android: label должен быть maptabview_name, но это дает мне ошибку, говоря, что соответствующий ресурс не найден.

Почему он запускается при использовании app_name для этого действия? Почему он не может найти ресурс maptabview_name?

Кроме того, в MapTab2 это лучший способ начать намерение? Что именно говорит система? «Я намерен начать занятие с этого класса»?

Вот мой код (Он основан на этом ):

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 голосов
/ 07 февраля 2012

Q1: maptabview_name должен находиться в файле строковых ресурсов, обычно в res/values/string.xml, если он у вас есть, но его нет в файле, сгенерированном ресурсами (gen/package/R.java), попробуйте удалить его и дать затмениюсгенерируйте это снова.

Q2: AFAIK, TabHost.TabSpec.setContent(Intent intent) это похоже на запуск действия в указанной вкладке.Я думаю, что именно так и поступают, когда вы имеете дело с вкладками.Поскольку Intents используются для многих вещей, это базовое использование, в данном случае просто для указания класса.

...