2

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

4

4 回答 4

4

一个有趣的问题。我知道您想在第一个选项卡视图中单击更改为第二个选项卡,但还将特殊数据传递给第二个选项卡,这取决于第一个选项卡中的操作。

我通常会在选项卡中通过活动开始您的视图。但是,这是在配置选项卡主机时完成的。这意味着两种意图都用于让用户选择经纬度的活动和显示经度经度的活动同时是开放的。

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

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

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

这将告诉 Android 在您的应用启动时将 CustomAppClass 实例化为您的 Application 类。您需要扩展应用程序以避免启动时出错。

另一种解决方案但不是我更喜欢的解决方案是自己初始化视图并用视图而不是活动来初始化 tabhost。使用其中一个选项卡中的地图视图,这可能会占用大量内存。

于 2010-06-15T15:32:36.227 回答
1

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

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

从一个项目到另一个项目的最佳方式。

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

唯一的缺点是你必须传递原始类型(int、string、boolean),但我相信你会想办法解决这个问题:)。

于 2010-06-15T20:10:50.720 回答
1

我在这里看不到问题:也许它有点骇人听闻,但以下代码对我有用:

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

这样你就不必弄乱这里提到的 Application、SharedPrefs 或其他不必要的东西

于 2011-09-23T10:15:06.057 回答
0

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

然后,您可以在第一个选项卡中为此意图添加额外的onPause()内容。注意:您必须在与 tabhost 不同的活动中定义所有选项卡,因为永远不会调用TabActivity此活动。onPause()

这也有助于上面的答案,如果您使用保存在扩展应用程序的活动中的全局变量,您可以在切换活动之前onPause()将其设置为它,如果在其他地方设置它,您可能会发现问题

于 2010-11-07T13:41:07.673 回答