Получить уведомление, когда текущая вкладка выбрана снова
Я реализовал TabActivity
который реализует OnTabChangeListener
, Активность будет уведомлена об изменениях вкладки (onTabChanged(String tabId)
).
Можно ли также получить уведомление, если пользователь снова выберет текущую вкладку?
Я хотел бы использовать это событие для обновления содержимого текущей вкладки вместо предоставления кнопки обновления на вкладке или в меню параметров.
Так я наконец решил проблему - подсказка была в ответе MisterSquonk.
(1) Определите OnTabReselectListener, который должен быть реализован действием, которое представляет содержимое вкладки и которое будет уведомлено о событиях повторного выбора.
/**
* Interface definition for a callback to be invoked when a current selected tab
* in a TabHost is selected again.
*/
public interface OnTabReselectListener {
/**
* Called when a current visible tab is selected again. Will not be invoked
* on tab changes.
*/
void onTabReselect();
}
(2) setOnTouchListener для каждого дочернего элемента tabWidget в onCreate() TabActivity (из ответа MisterSquonk)
for (int i = 0; i < tabWidget.getChildCount(); i++) {
View v = tabWidget.getChildAt(i);
v.setOnTouchListener(this);
}
(3) Реализуйте OnTouchListener.onTouch() в TabActivity. Выполните некоторую логику, чтобы решить, была ли текущая вкладка выбрана снова, и уведомите об активности вкладки.
/**
* @see android.view.View.OnTouchListener#onTouch(android.view.View,
* android.view.MotionEvent)
*/
@Override
public boolean onTouch(View v, MotionEvent event) {
boolean consumed = false;
// use getTabHost().getCurrentTabView to decide if the current tab is
// touched again
if (event.getAction() == MotionEvent.ACTION_DOWN
&& v.equals(getTabHost().getCurrentTabView())) {
// use getTabHost().getCurrentView() to get a handle to the view
// which is displayed in the tab - and to get this views context
View currentView = getTabHost().getCurrentView();
Context currentViewContext = currentView.getContext();
if (currentViewContext instanceof OnTabReselectListener) {
OnTabReselectListener listener = (OnTabReselectListener) currentViewContext;
listener.onTabReselect();
consumed = true;
}
}
return consumed;
}
4 ответа
Возможно, вам удастся заставить это работать, если ваша реализация TabActivity View.onTouchListener
и вызывая setOnTouchListener для каждой из вкладок...
for (int i = 0; i < tabWidget.getChildCount(); i++) {
View v = tabWidget.getChildAt(i);
v.setOnTouchListener(this);
}
Затем переопределите onTouch() в вашей деятельности...
@Override
public boolean onTouch(View v, MotionEvent event) {
// Not sure what to do here to identify each tab
return false;
}
Как вы можете видеть из комментария выше, я не уверен, что делать с View (параметр v) в слушателе onTouch, чтобы определить, какая вкладка была затронута.
Я могу подтвердить, что он срабатывает независимо от того, касаетесь ли вы выбранной в данный момент вкладки или не выбранной, и это не мешает смене вкладок.
Надеюсь, поможет.
Я немного новичок в Android, но я думаю, что у меня есть более подходящее решение этой проблемы.
Прежде всего (как указано ранее) этот код в TabHost.java делает невозможным прослушивание второго нажатия на кнопку вкладки:
public void setCurrentTab(int index) {
if (index < 0 || index >= mTabSpecs.size()) {
return;
}
if (index == mCurrentTab) {
return;
}
...
Итак, начните с создания собственного подкласса TabHost (com.mydomain.CustomTabHost)
@Override
public void setCurrentTab(int index) {
if (this.getCurrentTab() == index) {
// User clicked active tab...
}
super.setCurrentTab(index);
}
Ваш tabActivity ищет компонент TabHost с идентификатором "tabhost". Так что просто измените ссылку в вашем layout-xml с TabHost на новый пользовательский класс:
<com.yourdomain.CustomTabHost
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
(обратите внимание на атрибут android:id)
/Томми
Нет, это довольно невозможно. Ниже приведен код от TabHost
public void setCurrentTab(int index) {
if (index < 0 || index >= mTabSpecs.size()) {
return;
}
if (index == mCurrentTab) {
return;
}
...
У вас нет доступа к mCurrentTab, поэтому слушатель даже не вызывается.
Но если вы действительно хотите, вы можете попробовать рефлексию (например, изменить частное статическое конечное поле, используя рефлексию Java)
Я особенно работаю над 2.2 и использую ActivityGroup для объединения действий, так как фрагменты представлены в API 11. Итак, я не знаю о фрагментах, но если вы работаете с ActivityGroup, это работает для меня:
Во-первых, слава MisterSquonk за его "использование OnTouchListener
идея интерфейса!!
1) Сделай свой TabHost
статический то есть static TabHost tabhost
, В вашем ActivityGroup
возьми static
переменная класса того же класса (ActivityGroup), как static YourActivityGroup activitygroup;
и инициализировать в onCreate
с this
и создайте метод, который изменяет представление и действие на одной вкладке. лайк:
public void replaceContentView(String activityIdOrTag,Intent activityIntent)
{
View v= getLocalActivityManager().startActivity(activityIdOrTag,activityIntent)
.getDecorView();
this.setContentView(v);
}
2) Просто реализовать OnTouchListener
к любому из ваших действий, которые включены в ваш ActivityGroup
или я рекомендую внедрить к вашему ActivityGroup
,
3) Установите OnTouchListener
лайк
YourTabActivity.tabhost.getCurrentTabView().setOnTouchListener(this)
4) Сейчас в OnTouch(View v,MotionEvent e)
:
if (e.getAction()==MotionEvent.ACTION_DOWN)
{
Intent backToTop = new Intent(this, YourTopLevel.class);
YourActivityGroup.activitygroup.replaceContentView("YourTopActivity", backToTop);
}
Надеюсь, это поможет вам. Я новичок в Android. Любой вопрос будет с благодарностью.