Как использовать намерение между вкладками в Java / Android? - PullRequest
2 голосов
/ 15 июня 2010

Мне нужно знать, как обрабатывать намерения между вкладками.Например, у меня есть вкладка с двумя вкладками.Сначала по содержанию текстовое представление.Еще один вид карты.Когда я нажимаю на это текстовое представление, оно перенаправляется на tab2.это может быть легко достигнуто методами setCurrentTab (1) или setCurrentTabByTag ("tab2").Но я хочу передать значения lat и long в эту активность карты, чтобы сбросить булавку.Какой лучший способ использовать намерения или геттер / сеттер в Java?Что Вы предпочитаете?если ваш ответ "Intents".Как?

Ответы [ 4 ]

4 голосов
/ 15 июня 2010

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

Я бы обычно начинал ваши представления на вкладках с действия. Однако это делается в тот момент, когда хост вкладки настроен. Это означает, что оба намерения, одно для действия, которое позволяет пользователю выбирать lat long, и то, которое показывает lat long, являются открытыми одновременно.

Таким образом, вы не можете добавить информацию к намерению, используемому для инициализации хоста вкладок. Мне не нравится решение, но единственное, что приходит мне в голову (использование различных действий для вкладок), это использование пользовательского приложения , в котором хранится ссылка на объект, содержащий данные, которые необходимо обновить. вид на второй вкладке. Вы должны расширить приложение собственным классом и добавить этот класс в манифест, теперь вы можете вызвать getApplication на первой вкладке, приведя его к вашему набору классов приложения lat и задолго до того, как вы вызовете setCurrentTab. Во второй вкладке вы можете снова вызвать getApplication () , и затем вы получите объект приложения, который одинаков для каждого действия в каждый момент работы вашего приложения. Затем вы снова приводите его к объекту приложения и получаете значения lat и long. См. страницу в справочниках Google о том, как использовать пользовательский класс приложения.

Чтобы использовать пользовательский класс приложения, добавьте следующее в тег приложения в манифесте:

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

Это скажет Android создать экземпляр CustomAppClass в качестве класса приложения в момент запуска вашего приложения. Вам необходимо расширить приложение, чтобы избежать ошибок при запуске.

Другое решение, кроме того, которое я бы предпочел, состоит в том, чтобы инициализировать представления самостоятельно и инициализировать tabhost представлениями, а не действиями. С представлением карты в одной из вкладок это может быть очень много памяти.

1 голос
/ 23 сентября 2011

Я не вижу проблемы здесь: Может быть, это немного хакерски, но следующий Кодекс работает для меня:

    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 или другими ненужными вещами, упомянутыми здесь

1 голос
/ 16 июня 2010

Если вы хотите передать значения между действиями, я предлагаю посмотреть на

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

лучший способ получить значения из одного значения в другое.

При использовании sharedPrefferences существует только один экземпляр класса для всего приложения, что означает, что вы можете хранить значения в файлах, переключать намерения или действия, а затем вызывать те файлы sharedPrefrence, в которых есть данные. *

Единственным недостатком является то, что вы должны передавать примитивные типы (int, string, boolean), но я уверен, что вы обойдёте это :):

0 голосов
/ 07 ноября 2010

Если вы делаете намерение, которое используете, чтобы начать вторую вкладку, глобальным намерением.

Затем вы можете добавить дополнительные к этому намерению в onPause() на первой вкладке. Примечание. Вы должны определить все свои вкладки в отдельных действиях, а не в вашем вкладке TabActivity, поскольку onPause() этого действия никогда не вызывается.

Это также поможет с ответом, приведенным выше, если вы используете глобальную переменную, сохраненную в вашей активности, которая расширяет приложение, вы можете установить ее в onPause(), так как она запускается до активности , который может возникнуть при установке этого значения в другом месте

...