Как использовать намерение между вкладками в java/Android?

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


person Praveen    schedule 15.06.2010    source источник
comment
Как определены ваши вкладки? Являются ли они встроенными представлениями или различными действиями?   -  person Pentium10    schedule 15.06.2010
comment
Я использовал разные виды деятельности.   -  person Praveen    schedule 15.06.2010


Ответы (4)


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

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

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

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

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

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

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

person Janusz    schedule 15.06.2010
comment
вы меня сильно смутили. я использую разные действия для вкладок. когда я нажимаю представление на вкладке 1. он перенаправляется на эту активность карты (вторая вкладка). Главное, я получаю эту широту и долготу из tab1. это значение изменяется динамически. - person Praveen; 15.06.2010
comment
в этом проблема, вы не можете использовать намерения в этом случае, потому что намерение начать действие карты отправляется в момент инициализации вкладки. это означает, что вы не сможете прикрепить к нему данные позже. У вас должна быть какая-то глобальная доступная переменная для обоих действий, которая содержит значения lat long, которые я редактирую в своем посте, это все еще довольно сложно, но, возможно, уже не так запутанно. Я пытаюсь найти учебник по работе с пользовательскими классами приложений. - person Janusz; 15.06.2010
comment
я могу понять вашу мысль? борется с реализацией этого в манифесте. Можете ли вы опубликовать пример кода? - person Praveen; 15.06.2010
comment
я отредактировал пример кода, который показывает, как добавить пользовательский класс приложения в манифест - person Janusz; 16.06.2010
comment
я выполнил это, используя общие настройки. Спасибо. Но получите ошибку на карте Activity. то есть Не удалось получить клиент фабрики соединений. ты знаешь почему? - person Praveen; 16.06.2010
comment
Весь вопрос будет намного чище, если вы зададите его в отдельном вопросе. - person Janusz; 16.06.2010

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

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

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

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

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

person hwrdprkns    schedule 15.06.2010

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

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

person Rafael T    schedule 23.09.2011

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

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

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

person Blundell    schedule 07.11.2010