Вытягивание данных из одной активности вкладок в другую

Все, что я читал о намерениях, говорит об их использовании для передачи данных или для запуска одного действия из другого действия. Я хочу получить данные из действия, которое уже запущено.

Учебное пособие по макету вкладки по адресу http://developer.android.com/resources/tutorials/views/hello-tabwidget.html иллюстрирует то, что я хочу сделать. (Вместо этого мое приложение выполняет некоторые инженерные расчеты, но код учебника обеспечивает хорошую аналогию с моим приложением.) Учебник создает приложение с тремя вкладками, и на каждой вкладке размещается отдельное действие.

Чтобы расширить пример в руководстве, предположим, что я выбираю исполнителя на вкладке «Исполнители»/действии. Я хочу иметь возможность выбрать вкладку/активность «Альбомы» и отображать все альбомы с участием этого исполнителя.

Мне кажется, что для этого мне нужно использовать Intent. Все учебные пособия, которые я нашел, предполагают, что я создам кнопку «Просмотреть альбомы» на вкладке/действии «Исполнители», и что нажатие кнопки выполнит намерение, которое запускает действие «Альбомы» и передает имя исполнителя.

Я НЕ хочу создавать эту кнопку. Недвижимость на макете «Исполнители» бесценна, и у меня есть отличная вкладка «Альбомы», И активность HelloTabWidget уже содержит намерение создать вкладку «Альбомы».

Кроме того, пользователь может переключаться между альбомом и исполнителем, чтобы изменить выбор исполнителя, и вкладки — отличный способ сделать это. Нет необходимости усложнять пользовательский интерфейс еще одной кнопкой.

Итак, как я могу получить действие «Альбомы» PULL artistName из действия «Исполнители», когда выбрана вкладка «Альбомы» (или отображается макет «Альбомы»), а не действие «Исполнители» START Albums и PUSH имя исполнителя?

Эквиваленты, которые я могу придумать из других миров программирования:

  • Глобальные переменные. Разочарование в Android-разработчиках, верно? И если они есть, то как они называются?

  • Геттер, например artistName = Artists.getArtistName(); . Я чувствую, что это не так просто.

  • Запись и чтение из файла, то есть запоминающего устройства или энергонезависимой памяти. Мне не нужно, чтобы значение artistName было постоянным. Он будет сбрасываться на ноль каждый раз, когда пользователь запускает приложение.

Так как же это делается в мире Android? Использую ли я намерение — и если да, то как?


person Ray Depew    schedule 21.02.2012    source источник


Ответы (1)


Глобальные переменные были правильным ответом.

Я думал, что Java не одобряет их использование, но пара ссылок, появившихся в разделе «Связанные» ссылки на правом краю этого окна, прямо упоминают их. Один из них был "Android: как объявить глобальные переменные?", а другой - "как передать значение между двумя вкладками в android". Оба указали на класс приложения как на место для определения глобальных переменных и методов. Вооружившись этими новыми знаниями, я нашел статью под названием " Android Application Class" в блоге Xorant, в котором подробно описаны ответы StackOverflow.

Лучше сначала просмотреть эти три ссылки. Мне нужно добавить несколько советов к тому, что сказали эти авторы.

  1. Ваш класс приложения должен находиться в отдельном файле. (Для кого-то это может показаться "духом", но не для всех.) Вот хороший фреймворк для примера под названием 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. Я использую Eclipse с подключаемым модулем ADT в Windows XP. Eclipse не всегда ведет себя правильно, если вы редактируете XML-код напрямую, поэтому лучше открыть AndroidManifest.xml, затем выбрать вкладку «Приложение» и ввести имя приложения в поле «Имя». Не нужно ставить точку или точку перед именем. Просто введите имя вашего класса, например «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
      }
      // ...
    }
    

Это были единственные сбои, с которыми я столкнулся. Три ссылки, которые я перечислил, вместе взятые, в остальном довольно полны.

person Ray Depew    schedule 23.02.2012