Как связать дочернюю активность с TabHost для вызова публичной функции?
У меня есть TabHost с двумя дочерними действиями в нем (на двух вкладках). Я также реализовал публичную функцию в одном из этих действий, который я бы хотел вызвать из моего родителя (TabHost), чтобы вызвать некоторые действия на вкладке.
Можно ли связать сама деятельность с TabHost для вызова публичной функции?
Спасибо
вот моя настройка табуста:
res = getResources();
tabHost = getTabHost();
TabHost.TabSpec spec;
Intent intent;
intent = new Intent().setClass(this, home.class);
spec = tabHost.newTabSpec("home").setIndicator("Groups", res.getDrawable(R.drawable.groups)).setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, messages.class);
spec = tabHost.newTabSpec("messages").setIndicator("Messages", res.getDrawable(R.drawable.messages)).setContent(intent);
tabHost.addTab(spec);
Ответы
Ответ 1
Мой подход заключался бы в определении вложенного "слушателя" класса в дочерней активности, который расширяет BroadcastReceiver.
Затем я просто транслировал Intent из моей TabActivity, который затем запускал BroadcastReceiver для выполнения действия.
РЕДАКТИРОВАТЬ: Чтобы привести пример кода...
Шаги...
- Определить фильтр намерения в манифесте
- Добавить вложенный "прослушиватель" к дочерней активности
- Установить onResume()/onPause() в дочерней активности для регистрации/отмены регистрации слушателя
- Создайте намерение в TabActivity и передайте его, когда вы хотите, чтобы ребенок что-то делал
В AndroidManifest.xml
<activity
android:name=".MyActivity"
android:label="@string/app_name"
<intent-filter>
<action android:name="com.mycompany.myApp.DO_SOMETHING" />
</intent-filter>
</activity>
В MyActivity.java
public class MyActivity extends Activity {
private MyListener listener = null;
private Boolean MyListenerIsRegistered = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreated(savedInstanceState);
listener = new MyListener();
}
@Override
protected void onResume() {
super.onResume();
if (!MyListenerIsRegistered) {
registerReceiver(listener, new IntentFilter("com.mycompany.myApp.DO_SOMETHING"));
MyListenerIsRegisterd = true;
}
}
@Override
protected void onPause() {
super.onPause();
if (MyListenerIsRegistered) {
unregisterReceiver(listener);
MyListenerIsRegistered = false;
}
}
// Nested 'listener'
protected class MyListener extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// No need to check for the action unless the listener will
// will handle more than one - let do it anyway
if (intent.getAction().equals("com.mycompany.myApp.DO_SOMETHING")) {
// Do something
}
}
}
}
В главном TabActivity
private void MakeChildDoSomething() {
Intent i = new Intent();
i.setAction("com.mycompany.myApp.DO_SOMETHING");
sendBroadcast(i);
}
Ответ 2
Я нашел другое, возможно более простое решение. Я уверен, что OP этого больше не потребуется, но, возможно, кто-то из будущего будет рад его найти.
Итак, в принципе, для запуска открытого метода в вашей дочерней активности вам просто нужен этот маленький кусок кода в родительском (tabHost
, home
и message
взяты из конфигурации OP TabHost):
tabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
@Override
public void onTabChanged(String tabId) {
Activity currentActivity = getCurrentActivity();
if (currentActivity instanceof home) {
((home) currentActivity).aPublicMethodFromClassHome();
}
if (currentActivity instanceof messages) {
((messages) currentActivity).aPublicMethodFromClassMessages();
}
}
});
Я использую его в своем приложении. Работает как шарм;)
Ответ 3
В настоящее время я отлаживаю приложение для Android и сталкиваюсь с такой же потребностью. Я нашел очень простой ответ на этот фрагмент кода:
String currentActivityId = getLocalActivityManager().getCurrentId();
Activity currentActivity = getLocalActivityManager().getActivity(currentActivityId);
Идентификатор здесь - это идентификатор, указанный при создании TabSpec:
tabHost.newTabSpec("id").setIndicator(indicator).setContent(intent);
Ответ 4
Спасибо, это помогло мне решить симулятивную проблему!
Activity currentActivity = getLocalActivityManager().getActivity(_TabHost.getCurrentTabTag());
if(currentActivity != null && currentActivity instanceof iMyActivity)
{
// pass to children
((iMyActivity)currentActivity).onLaunchDelegate();
}
Ответ 5
Из этой ссылки я нашел это простое решение (http://androidactivity.wordpress.com/2012/08/17/two-way-communication-between-tabactivity-and-its-child-tabs/):
Ну, трюк заключается в том, чтобы сохранить TAG, связанный с каждой вкладкой, и использовать его для вызова соответствующего действия.
Когда вы создаете вкладку, вы связываете ее с тегом, как показано ниже:
yourTabHost.newTabSpec("Tab1");
Предположим, мы хотим вызвать метод refreshContent(), который находится внутри Activity Tab.
Прост как вызов этих строк из MainActivity:
ActivityTab1 activity = (ActivityTab1) getLocalActivityManager().getActivity("Tab1");
activity.refreshContent();
И вот оно!
Теперь в противоположном направлении мы хотим вызвать некоторый метод "updateMain()" внутри MainActivity, с дочерней вкладки TabActivity1.
В TabActivity1 вам нужно будет только позвонить
((MainActivity)getParent()).updateMain();
Ответ 6
найти это просто, использовать его в приложении ActivityTab class:
if(getCurrentActivity() instanceof YourSearchActivity){
log("onClick: instance found");
((YourSearchActivity)getCurrentActivity()).activityPublicFuntion();
}