Получать уведомления, когда текущая вкладка снова выбрана
Я реализовал 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;
}
Ответы
Ответ 1
Возможно, вам удастся заставить это работать, выполнив реализацию 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, чтобы определить, какая Tab была затронута.
Я могу подтвердить, что он срабатывает независимо от того, касаются ли вы текущую выбранную вкладку или та, которая не выбрана, и она не мешает изменению вкладок.
Надеюсь, что это поможет.
Ответ 2
Я как бы новичок в 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". Поэтому просто измените ссылку в своем макете-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)
/Tommy
Ответ 3
Нет, это невозможно. Ниже приведен код из TabHost
public void setCurrentTab(int index) {
if (index < 0 || index >= mTabSpecs.size()) {
return;
}
if (index == mCurrentTab) {
return;
}
...
У вас нет доступа к mCurrentTab, поэтому слушатель даже не вызывается.
Но если вы действительно хотите, вы можете попробовать отражение (Изменить приватное статическое конечное поле с использованием отражения Java)
Ответ 4
Я особенно работаю над 2.2 и использую ActivityGroup для группировки действий, поскольку Фрагменты представлены в API 11.
Итак, я не знаю о фрагментах, но если вы работаете с ActivityGroup, это работает для меня:
Во-первых, Kudos для MisterSquonk за его "использование идеи интерфейса OnTouchListener
!!"
1) Сделайте статический TabHost
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);
}
Надеюсь, это поможет вам. Я новичок в андроиде. Любой вопрос будет с благодарностью.