0

我读过的关于 Intents 的所有内容都谈到了使用它们来推送数据,或者从另一个 Activity 启动一个 Activity。我想从已经运行的活动中提取数据。

http://developer.android.com/resources/tutorials/views/hello-tabwidget.html上的选项卡布局教程说明了我想要做什么。(我的应用程序正在做一些工程计算,但教程代码很好地类比了我的应用程序。)本教程创建了一个包含三个选项卡的应用程序,每个选项卡都托管一个单独的活动。

为了扩展本教程中的示例,假设我在 Artists 选项卡/活动中选择了一位艺术家。我希望能够选择“专辑”选项卡/活动并让它显示该艺术家的所有专辑。

在我看来,我需要使用 Intent 来执行此操作。我发现的所有教程都假设我将在艺术家选项卡/活动中创建一个“查看专辑”按钮,并且按下该按钮将执行一个启动专辑活动并传递艺术家姓名的意图。

我不想创建那个按钮。Artists 布局上的不动产是宝贵的,我有一个非常好的专辑选项卡,并且 HelloTabWidget 活动已经包含创建专辑选项卡的意图。

此外,用户会希望在专辑和艺术家之间来回跳转以更改艺术家选择,而选项卡是执行此操作的绝佳方式。无需使用另一个按钮使 UI 复杂化。

So how can I have the Albums activity PULL artistName from the Artists activity when the Albums tab is selected (or the Albums layout is displayed), rather than have the Artists activity START Albums and PUSH the artistName?

我可以从其他编程世界中想到的等价物:

  • 全局变量。对 Android devt 感到沮丧,对吧?如果它们确实存在,它们叫什么?

  • 吸气剂,如artistName = Artists.getArtistName();. 我感觉这并不容易。

  • 写入和读取文件 - 即大容量存储或非易失性存储器。我不需要 ArtistName 值是永久的。每次用户启动应用程序时,它将被重置为 null。

那么它是如何在 Android 世界中完成的呢?我是否使用 Intent - 如果是,如何使用?

4

1 回答 1

0

全局变量是正确的答案。

我认为 Java 不鼓励使用它们,但出现在此窗口右侧边缘的“相关”链接中的几个链接直接提到了它们。其中之一是“Android:如何声明全局变量?” 另一个是“如何在 android 中的两个选项卡之间传递值”。两者都指向应用程序类作为定义全局变量和方法的地方。有了这些新知识,我在 Xoriant 博客上找到了一篇名为“Android 应用程序类”的文章,该文章扩展了 StackOverflow 的答案。

最好先查看这三个链接。我需要为那些作者所说的添加一些提示。

  1. 您的 Application 类必须在其自己的单独文件中。(这对某些人来说可能是“duh”,但不是对所有人。)下面是一个名为Something.java 的示例的好框架:

    public class Something extends Application {
    
      // Put application wide (global) variables here
      // Constants are final, so they don't have to be private
      // But other variables should be declared private;
      //  use getters/setters to access them
      public final boolean FEET = false;
      public final boolean METERS = true;
      private boolean units = FEET;
    
      @Override
      public void onCreate() {
        super.onCreate();
        // Put any application wide (global) initialization here
      }
    
      // Put application wide (global) methods here
      public boolean getUnits() {
        return units;
      }
    
      public void setUnits(boolean whichOne) {
        units = whichOne;
      }
    }
    
  2. 我在 Windows XP 中使用带有 ADT 插件的 Eclipse。如果您直接编辑 XML 代码,Eclipse 并不总是正常运行,因此最好打开 AndroidManifest.xml,然后选择 Application 选项卡并在 Name 字段中输入您的应用程序名称。您无需在名称前添加点或句点。只需输入您的班级名称,例如“Globals”或“MyApplication”或其他任何名称。(请注意,这是清单中的默认应用程序。您不必创建单独的<application></application>标签。 摘自 Eclipse 的清单编辑页面

  3. 此步骤在实际的 Android 设备上可能不是必需的,但对于模拟器是必需的:您需要在将访问全局变量和方法的每个方法中使用该getApplicationContext()命令。onCreate()我试图将它onCreate()与我的其他活动范围变量放在一起,但它没有用。将它放在每个方法中似乎很浪费,但是模拟器和 Android 设备都可以很好地使用它。这是一个显示我如何使用它的示例:

    public void fooBar() {
      // Access to global variables and methods
      final Something s = (Something)getApplicationContext();
    
      // ...
      // This next line demonstrates both a global method and a global variable
      if (s.getUnits() == s.FEET) {
        // do something with feet
      } else {
        // do something with meters instead
      }
      // ...
    }
    

这些是我遇到的唯一问题。我列出的三个参考资料放在一起,在其他方面非常完整。

于 2012-02-23T19:03:18.180 回答