2010-06-15 57 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东西

相关问题