2010-06-15 64 views
2

我需要知道如何處理選項卡之間的意圖。例如,我有一個帶有兩個選項卡的選項卡活動。首先在內容上是文本視圖。另一個是地圖視圖。當我點擊該文本視圖時,它重定向到tab2。它可以通過setCurrentTab(1)或setCurrentTabByTag(「tab2」)方法輕鬆實現。但是我想將經緯度和長距離值傳遞給該地圖活動以放置引腳。在java中使用intent或getter/setter的更好方法是什麼?你喜歡哪個?如果你的答案是「意圖」。怎麼樣?如何在java/Android中的標籤之間使用意圖?

+1

你的標籤頁是如何定義的?他們是嵌入視圖還是不同的活動? – Pentium10 2010-06-15 15:27:17

+0

我已經使用了不同的活動。 – Praveen 2010-06-15 15:53:28

回答

4

一個有趣的問題。我瞭解到,您希望在第一個標籤頁視圖中點擊第二個標籤頁,但也會將特殊數據傳遞給第二個標籤頁,而第二個標籤頁依賴於第一個標籤頁中的操作。

我通常會在活動的標籤頁中開始您的視圖。但是,這是在配置選項卡主機的時候完成的。這意味着既可以讓用戶選擇lat的活動和同時顯示lat的活動同時開放。

因此,您無法將信息添加到用於初始化選項卡主機的意圖。 我不喜歡這個解決方案,但唯一出現在我腦海中的是使用定製的application,該定製存儲對包含數據的對象的引用,您需要在第二個視圖中更新視圖標籤。您必須使用自己的類擴展應用程序,然後將該類添加到manifest中,現在可以在第一個選項卡中調用getApplication將其轉換爲您的應用程序類set lat和long,然後再調用setCurrentTab。在第二個選項卡中,您可以再次調用getApplication(),然後您將獲得應用程序對象,該對象在運行應用程序的每個時刻都與每個活動相同。然後您再次將其轉換爲您的應用程序對象並檢索lat和long值。請參閱google中的page以瞭解如何使用自定義應用程序類。

要使用自定義的應用程序類中添加以下到您的應用程序標記在您的清單:

<application 
    ... 
    android:name=".somepackage.CustomAppClass" 

這將告訴Android的實例化CustomAppClass爲您的應用程序類在你的應用程序啓動的時刻。您需要擴展應用程序以避免啓動時出現錯誤。

另一個解決方案,但我不希望自己初始化視圖,並用視圖而不是活動初始化tabhost。在其中一個選項卡中顯示地圖視圖時,這可能會非常沉重。

+0

你讓我困惑不已。我正在爲選項卡使用不同的活動。當我點擊tab1上的一個視圖。它重定向到該地圖活動(第二個標籤)。主要的事情我從tab1獲取經度和緯度。該值動態變化。 – Praveen 2010-06-15 15:57:23

+1

這是您在此情況下無法使用意圖的問題,因爲您在初始化選項卡時發送啓動地圖活動的意圖。這意味着你以後不能附加數據。你需要有一個全局可訪問的變量,這兩個活動都包含緯度長的值 我修改了我的文章,它仍然非常複雜,但可能不會再讓人困惑。我嘗試找到一個使用自定義應用程序類的教程。 – Janusz 2010-06-15 16:32:31

+0

然後我想使用getter/setter方法。對? – Praveen 2010-06-15 17:50:05

1

如果你想通過活動之間的值,我建議在看

http://developer.android.com/reference/android/content/SharedPreferences.html

擺脫一個itent值到另一個的最佳途徑。

使用sharedPrefrences,整個應用程序只有一個類實例,這意味着您可以將值存儲在文件中,切換intent或活動,然後調用那些包含數據的sharedPrefrence文件。

唯一的缺點是你必須傳遞原始類型(int,string,boolean),但我相信你會想辦法解決這個:)。

0

如果您制定了用於啓動第二個選項卡活動的意圖全局意圖。

然後,您可以在第一個選項卡的onPause()中爲此目的添加額外內容。注意:由於此活動的onPause()永遠不會被調用,因此您必須在單獨的活動中定義所有標籤,而不是您的標籤主機TabActivity

這也有助於與答案以上,如果使用的是保存在活動的全局變量擴展應用程序,你可以因爲它是之前解僱活動切換在onPause()設置此,你可能會發現如果設置的問題。此別處

1

我沒有看到這裏的問題: 也許它的hackish,但下面的代碼的一點點對我的作品:

public boolean onClick(View v) { 
    //get your data you wanna send. 
    //If it is an Object it would be good if it is Parcelable 
    Object o = getYourData(); 
    // or Parcelable p = getYourData 
    Activity activity = getParent(); 
    //I'm assuming were inside an Activity which is started by TabActivity 
    if (activity instanceof TabActivity){ 
     TabActivity ta = (TabActivity)activity; 
     //now determine the Tab you wanna start 
     ta.getTabHost().setCurrentTabByTag("yourTag"); 
     //or ta.getTabHost().setCurrentTab(yourID); 
     Activity current = ta.getCurrentActivity(); 
     //check if the Activity is the one you wanna start 
     if (current instanceof YOUR_ACTIVITY_YOU_WANNA_START){ 
      //Cast to your Activity 
      YOUR_ACTIVITY_YOU_WANNA_START yourActivity = 
        (YOUR_ACTIVITY_YOU_WANNA_START)current; 
      // you only need to put Data inside your Intent 
      Intent intent = new Intent(); 
      intent.putExtra("EXTRA_DATA_TAG", o); 
      //your Activity must Override onNewIntent and make it public, 
      //or simply add another method 
      //with whatever You like as parameter 
      yourActivity.onNewIntent(intent); 
      return true; 
     } 
    } 
    return false; 
} 

這樣你就不必惹應用,SharedPrefs或其他unn這裏提到的esseary東西

相關問題