Подтвердить что ты не робот

Как связать дочернюю активность с 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);
4b9b3361

Ответ 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();
        }