在java/Android中如何在选项卡之间使用intent?

在java/Android中如何在选项卡之间使用intent?,android,android-intent,android-tabhost,Android,Android Intent,Android Tabhost,我需要知道如何处理选项卡之间的意图。例如,我有一个包含两个选项卡的选项卡活动。首先,内容是一个文本视图。另一个是地图视图。单击该文本视图时,它将重定向到tab2。它可以通过setCurrentTab(1)或setCurrentTabByTag(“tab2”)方法轻松实现。但是我想把lat和long值传递给映射活动,以放置pin。在java中使用意图或getter/setter的更好方法是什么?你喜欢什么?如果你的答案是“意图”。怎么做?一个有趣的问题。我知道,您希望在第一个选项卡视图中单击后切换

我需要知道如何处理选项卡之间的意图。例如,我有一个包含两个选项卡的选项卡活动。首先,内容是一个文本视图。另一个是地图视图。单击该文本视图时,它将重定向到tab2。它可以通过setCurrentTab(1)或setCurrentTabByTag(“tab2”)方法轻松实现。但是我想把lat和long值传递给映射活动,以放置pin。在java中使用意图或getter/setter的更好方法是什么?你喜欢什么?如果你的答案是“意图”。怎么做?

一个有趣的问题。我知道,您希望在第一个选项卡视图中单击后切换到第二个选项卡,但也要将特殊数据传递到第二个选项卡,该选项卡依赖于第一个选项卡中的操作

我通常会在选项卡中以活动开始视图。但是,这是在配置选项卡主机时完成的。这意味着这两个意图——让用户选择lat long的活动的意图和显示lat long的活动的意图——都是同时打开的

因此,您不能将信息添加到用于初始化选项卡主机的意图中。 我不喜欢这个解决方案,但我想到的唯一一件事(对选项卡使用不同的活动)是使用一个自定义项来存储对对象的引用,该对象包含更新第二个选项卡中视图所需的数据。您必须使用自己的类扩展应用程序并在清单中添加此类,现在您可以在第一个选项卡中调用getApplication,并在调用setCurrentTab之前将其强制转换为应用程序类set-lat和long。在第二个选项卡中,您可以再次调用,然后您将获得应用程序对象,该对象在应用程序运行的每一时刻对每个活动都是相同的。然后将其再次强制转换到应用程序对象,并检索lat和long值。有关如何使用自定义应用程序类,请参见google参考资料

要使用自定义应用程序类,请将以下内容添加到清单中的应用程序标记中:

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

如果要在活动之间传递值,我建议查看

从一个itent到另一个itent获取值的最佳方法

对于SharedReference,整个应用程序只有一个类实例,这意味着您可以在文件中存储值,切换意图或活动,然后调用其中包含数据的SharedReference文件


唯一的缺点是您必须传递基本类型(int、string、boolean),但我相信您会找到解决方法:)。

如果您将用于启动第二个选项卡活动的意图设置为全局意图

然后,您可以在第一个选项卡的
onPause()
中为此目的添加额外的。注意:您必须在tabhost
TabActivity
之外的单独活动中定义所有选项卡,因为此活动的
onPause()
从未被调用


这也有助于上面的回答,如果您使用的是保存在扩展应用程序的“活动”中的全局变量,则可以在切换“活动”之前启动的
onPause()
中设置此变量,如果在其他地方设置此变量,您可能会发现问题 也许这有点黑客,但下面的代码对我来说很有用:

    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;
}

这样,您就不必处理这里提到的应用程序、SharedPref或其他不必要的东西

选项卡是如何定义的?它们是嵌入视图还是不同的活动?我使用了不同的活动。你把我弄糊涂了。我正在为选项卡使用不同的活动。单击选项卡1上的视图时。它重定向到该映射活动(第二个选项卡)。主要的是我从表1中得到了经度和纬度。该值会动态更改。这就是在本例中无法使用意图的问题,因为启动映射活动的意图是在初始化选项卡时发送的。这意味着您以后无法将数据附加到它。这两个活动都需要一些全局可访问的变量来保存我在我的帖子中编辑的lat long值,这仍然非常复杂,但可能不再那么混乱。我试图找到一个使用自定义应用程序类的教程。我能理解你的想法吗?正在努力在清单上实现它。你能发布一些示例代码吗?我编辑了一些示例代码,演示了如何将自定义应用程序类添加到清单中。我已经使用共享首选项完成了这项工作。谢谢但是在映射活动中获取错误。也就是说,无法获取连接工厂客户端。你知道为什么吗?