Мне нужно знать, как обрабатывать намерения между вкладками. Например, у меня есть активность с двумя вкладками. Первым по содержанию является текстовое представление. другой вид карты. Когда я нажимаю на это текстовое представление, оно перенаправляется на вкладку 2. это может быть легко достигнуто с помощью методов setCurrentTab(1) или setCurrentTabByTag("tab2"). Но я хочу передать значения широты и долготы в эту активность карты, чтобы сбросить булавку. Как лучше использовать намерения или геттер/сеттер в java? Что ты предпочитаешь? если ваш ответ "Намерения". Как?
Как использовать намерение между вкладками в java/Android?
Ответы (4)
Интересная проблема. Я понимаю, что вы хотите перейти на вторую вкладку по щелчку в первой вкладке, но также передать специальные данные на вторую вкладку, которая зависит от действия на первой вкладке.
Обычно я бы начинал ваши представления внутри вкладок с активности. Однако это делается в момент настройки хоста вкладки. Это означает, что оба намерения: одно для действия, которое позволяет пользователю выбирать lat long, и другое, которое показывает lat long, являются открытыми одновременно.
Поэтому вы не можете добавить информацию к намерению, используемому для инициализации хоста вкладки. Мне не нравится это решение, но единственное, что приходит мне в голову (используя различные действия для вкладок), — это использование пользовательского приложение, в котором хранится ссылка на объект, содержащий данные, необходимые для обновления представления во второй вкладке. Вы должны расширить приложение с помощью собственного класса и добавить этот класс в свой манифест, теперь вы можете вызвать getApplication на первой вкладке и привести его к набору классов вашего приложения lat и long непосредственно перед вызовом setCurrentTab. На второй вкладке вы можете вызвать getApplication () еще раз, и вы получите объект приложения, который будет одинаковым для каждого действия в каждый момент работы вашего приложения. Затем вы снова примените его к объекту приложения и получите значение lat и long. См. эту страницу в ссылках Google на как использовать пользовательский класс приложения.
Чтобы использовать собственный класс приложения, добавьте в тег приложения в манифесте следующее:
<application
...
android:name=".somepackage.CustomAppClass"
Это укажет Android создать экземпляр CustomAppClass в качестве класса вашего приложения в момент запуска вашего приложения. Вам необходимо расширить приложение, чтобы избежать ошибок при запуске.
Другое решение, но не то, которое я бы предпочел, - это инициализировать представления самостоятельно и инициализировать вкладку с представлениями, а не с действиями. С видом карты на одной из вкладок это может быть очень много памяти.
Если вы хотите передавать значения между действиями, я предлагаю посмотреть на
http://developer.android.com/reference/android/content/SharedPreferences.html
лучший способ получить значения от одного объекта к другому.
При использовании sharedPrefrences существует только один экземпляр класса для всего приложения, а это означает, что вы можете хранить значения в файлах, переключать намерения или действия, а затем вызывать те файлы sharedPrefrence, в которых есть данные.
Единственным недостатком является то, что вам нужно передавать примитивные типы (int, string, boolean), но я уверен, что вы найдете способы обойти это :).
Я не вижу здесь проблемы: может быть, это немного хакерски, но у меня работает следующий код:
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 или другими ненужными вещами, упомянутыми здесь.
Если вы сделаете намерение, которое вы используете для запуска второй вкладки, глобальным намерением.
Затем вы можете добавить дополнительные элементы к этому намерению в onPause()
первой вкладки. Примечание. Вы должны определить все свои вкладки в отдельных действиях, а не вкладки TabActivity
, так как это действие onPause()
никогда не вызывается.
Это также помогает с ответом выше, если вы используете глобальную переменную, сохраненную в вашей активности, которая расширяет приложение, вы можете установить это в onPause()
, поскольку она запускается до переключения активности, что вы можете найти проблему, если установить это в другом месте