如何在java / Android中使用选项卡之间的意图?

时间:2010-06-15 15:01:15

标签: android android-intent android-tabhost

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

4 个答案:

答案 0 :(得分:4)

一个有趣的问题。我理解您要在第一个tabview中单击更改为第二个选项卡,但也将特殊数据传递到第二个选项卡,该选项卡依赖于第一个选项卡中的操作。

我通常会在标签中用活动开始你的观点。但是,这是在配置选项卡主机时完成的。这意味着两个意图用于允许用户选择lat long的活动和用于显示lat long的活动同时打开。

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

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

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

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

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

答案 1 :(得分:1)

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

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

从一个迭代到另一个迭代获取值的最佳方法。

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

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

答案 2 :(得分:1)

我在这里看不到问题: 也许它有点hackish但是跟随Code对我有用:

    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或其他提到的无关物质了

答案 3 :(得分:0)

如果您使用的目的是启动第二个标签活动的全局意图。

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

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

,您可能会发现问题