Перенос данных из одной вкладки в другую - PullRequest
0 голосов
/ 22 февраля 2012

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

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

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

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

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

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

Так, как я могу иметь действие PULL PUN ArtistName из действия Artists, когда выбрана вкладка Albums (или отображается макет Albums), вместо того, чтобы действие Artists START Albums и PUSH the artistName?

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

  • Глобальные переменные. Обескуражен в Android DevT, верно? И если они существуют, как они называются?

  • Получатель, как artistName = Artists.getArtistName();. У меня такое ощущение, что это не так просто.

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

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

1 Ответ

0 голосов
/ 23 февраля 2012

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

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

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

  1. Ваш класс Application должен находиться в отдельном файле. (Это может быть «духом» для некоторых людей, но не для всех.) Вот хорошая основа для примера под названием 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>. excerpt from Eclipse's Manifest edit page

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

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

...