0

Everything I've read about Intents talks about using them to push data, or to start one Activity from another Activity. I want to pull data from an Activity that's already running.

The Tab Layout tutorial at http://developer.android.com/resources/tutorials/views/hello-tabwidget.html illustrates what I want to do. (My app is doing some engineering calculations instead, but the tutorial code provides a good analogy to my app.) The tutorial creates an app with three tabs, and each tab hosts a separate activity.

To expand on the example in the tutorial, suppose I select an artist in the Artists tab/activity. I want to be able to select the Albums tab/activity and have it display all the albums featuring that artist.

It seems to me that I need to use an Intent to do this. All of the tutorials I've found assume that I would create a "See albums" Button in the Artists tab/activity, and that pressing the Button would execute an Intent that starts the Albums activity and passes artistName.

I DO NOT want to create that Button. Real estate on the Artists layout is precious, and I have a perfectly good Albums tab, AND the HelloTabWidget activity already contains an intent to create the Albums tab.

Besides, a user will want to skip back and forth between Album and Artist in order to change artist selections, and the tabs are a perfectly good way to do this. There's no need to complicate the UI with another button.

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?

Equivalents I can think of from other programming worlds:

  • Global variables. Discouraged in Android devt, right? And if they do exist, what are they called?

  • A getter, like artistName = Artists.getArtistName(); . I get the feeling that it's not that easy.

  • Writing to, and reading from, a file - that is, mass storage or non-volatile memory. I don't need the artistName value to be permanent. It will be reset to null every time the user launches the application.

So how is it done in the Android world? Do I use an Intent - and if so, how?

Dirk Jäckel
  • 2,979
  • 3
  • 29
  • 47
Ray Depew
  • 573
  • 1
  • 9
  • 22

1 Answers1

0

Global variables were the right answer.

I thought Java discouraged their use, but a couple of links that appeared in the "Related" links on the right margin of this window mentioned them directly. One was "Android: How to declare global variables?" and the other was "how to pass value betweeen two tab in android". Both pointed to the Application Class as the place to define global variables and methods. Armed with this new knowledge, I found an article called "Android Application Class" on the Xoriant blog that expanded on the StackOverflow answers.

It's best to review those three links first. I need to add some tips to what those authors have said.

  1. Your Application class has to be in its own separate file. (That might be a "duh" to some people, but not to everybody.) Here's a good framework for an example called 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. I'm using Eclipse with the ADT plug-in, in Windows XP. Eclipse doesn't always behave properly if you edit XML code directly, so it's best to open AndroidManifest.xml, then select the Application tab and enter your application name in the Name field. You don't need to put a dot or period in front of the name. Just type in the name of your class, like "Globals" or "MyApplication" or whatever. (Note that this is the default application in your Manifest. You don't have to create a separate <application></application> tag. excerpt from Eclipse's Manifest edit page

  3. This step may not be necessary on an actual Android device, but it was necessary for the emulator: you need to use the getApplicationContext() command in every onCreate() and every method that will be accessing the global variables and methods. I tried to put it outside of onCreate() with the rest of my activity wide variables, and it didn't work. Putting it inside every method seems wasteful, but both the emulator and the Android device work fine with it that way. Here's a sample showing how I used it:

    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
      }
      // ...
    }
    

Those were the only hiccups I encountered. The three references that I have listed, taken together, are otherwise pretty complete.

Community
  • 1
  • 1
Ray Depew
  • 573
  • 1
  • 9
  • 22