Как ссылаться на активность ребенка из TabHost для вызова публичной функции? - PullRequest
17 голосов
/ 23 марта 2011

У меня есть 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);

Ответы [ 6 ]

22 голосов
/ 23 марта 2011

Мой подход заключается в определении вложенного класса «слушателя» в дочернем действии, который расширяет BroadcastReceiver.

Затем я просто передаю Намерение из моего TabActivity, которое затем запускает BroadcastReceiver для выполнения действия.

РЕДАКТИРОВАТЬ: Чтобы привести пример кода ...

Шаги ...

  1. Определение фильтра намерений в манифесте
  2. Добавление вложенного «слушателя» в дочернее действие
  3. Установить onResume () / onPause () в дочерней активности для регистрации / отмены регистрации слушателя
  4. Создайте намерение в 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>

In 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's do it anyway
            if (intent.getAction().equals("com.mycompany.myApp.DO_SOMETHING")) {
                // Do something
            }
        }
    }
}

В основной вкладке Активность

private void MakeChildDoSomething() {

    Intent i = new Intent();
    i.setAction("com.mycompany.myApp.DO_SOMETHING");
    sendBroadcast(i);
}
16 голосов
/ 03 декабря 2011

Я нашел другое, возможно, более простое решение.Я уверен, что 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();
        }
    }
});

Я использую его в своем приложении.Работает как брелок;)

6 голосов
/ 24 ноября 2011

Я в настоящее время отлаживаю приложение для Android и столкнулся с такой же необходимостью. Я нашел очень простой ответ на этот фрагмент кода:

String currentActivityId = getLocalActivityManager().getCurrentId();
Activity currentActivity = getLocalActivityManager().getActivity(currentActivityId);

Идентификатор здесь - это идентификатор, данный при создании TabSpec:

tabHost.newTabSpec("id").setIndicator(indicator).setContent(intent);
4 голосов
/ 02 декабря 2011

Спасибо, это помогло мне решить симуляционную задачу!

Activity currentActivity = getLocalActivityManager().getActivity(_TabHost.getCurrentTabTag());
if(currentActivity != null && currentActivity instanceof iMyActivity)
{
// pass to children
((iMyActivity)currentActivity).onLaunchDelegate();
}
1 голос
/ 27 августа 2014

По этой ссылке я нашел это простое решение (http://androidactivity.wordpress.com/2012/08/17/two-way-communication-between-tabactivity-and-its-child-tabs/):

Хорошо, уловка заключается в том, чтобы сохранить TAG, связанный с каждой вкладкой, и использовать его для вызова соответствующего действия.

Когда вы создаете вкладку, вы связываете ее с тегом, подобным следующему:

yourTabHost.newTabSpec("Tab1");

Допустим, мы хотим вызвать метод «refreshContent ()», который находится внутри действия Tab1.

Это просто, как вызов этих линий из MainActivity:

ActivityTab1 activity = (ActivityTab1) getLocalActivityManager().getActivity("Tab1");
 activity.refreshContent();

И это все!

Теперь для обратного направления мы хотим вызвать некоторый метод updateMain () внутри MainActivity, из дочерней вкладки TabActivity1.

В TabActivity1 вам нужно будет только позвонить

((MainActivity)getParent()).updateMain();
0 голосов
/ 02 марта 2014

найти это просто, используйте его в классе ActivityTab приложения:

if(getCurrentActivity() instanceof YourSearchActivity){
            log("onClick: instance found");
            ((YourSearchActivity)getCurrentActivity()).activityPublicFuntion();
        }
...