2 lidaming and LiDaming_and 于 2012.12.07 15:58 提问

如何从TabHost中引用一个子activity来调用一个公共函数?

在TabHost中有两个子activity,这两个子activity在两个tab中。在其中的一个activity实现了一个公共函数,我想从父类TabHost中调用这个函数,来触发tab中的一些action。
能否从TabHost中引用activity本身来调用一个公共函数?
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);

2个回答

curie_87
curie_87   2012.12.07 17:43
已采纳

是之前遇见过这个问题是这样解决的:
1.在manifest文件中设置intent filter
2.给子activity添加嵌套的'listener'
3.在子activity的onResume()/onPause()到register/unregister监听器
4.在TabActivity创建intent,然后广播。
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's do it anyway
            if (intent.getAction().equals("com.mycompany.myApp.DO_SOMETHING")) {
                // Do something
            }
        }
    }
}

main TabActivity

private void MakeChildDoSomething() {

    Intent i = new Intent();
    i.setAction("com.mycompany.myApp.DO_SOMETHING");
    sendBroadcast(i);
}
CSDN_Ask
CSDN_Ask   2012.12.10 14:16

希望能帮你解决问题:

 Activity currentActivity = getLocalActivityManager().getActivity(_TabHost.getCurrentTabTag());
    if(currentActivity != null && currentActivity instanceof iMyActivity)
    {
    // 传递给子类
    ((iMyActivity)currentActivity).onLaunchDelegate();
    }
mazuchao2008
mazuchao2008 你的这个既简单又好用,学习了!
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
android开发中,有关TABhost中各个子Activity跳转的问题(帮大忙)
博主最近在android开发中涉及到Tabhost这个控件,发现用起来非常的蛋疼。在Tabhost里面有四个界面,第一个是摄像头预览的界面,第二个是一个简单的页面,每次楼主打开第一个预览界面的时候,再跳转到第二个界面,再转回第一个预览界面就发现卡住了,真是头疼。经过一番研究,终于发现,在Tabhost里面生命周期是和平常的不一样,在各个子Activity里面跳转时不会重复执行onCreate()方
c#公共类直接调用方法
公共类直接调方法    C# codeusing System;using System.Collections.Generic;using System.Data;using System.Data.OracleClient;using System.Web.UI.WebControls;namespace DBClass{    public class DBClass    {       
TabHost实现多个Activity界面间切换
1、主Activity继承至TabActivity public class MainActivity extends TabActivity { private TabHost tabHost; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSta
Android用tabhost实现 界面切换,每个界面为一个独立的activity
// 要extends TabActivity public class Main_activity extends TabActivity { private TabHost tabHost;// 建立Tabhost控件 protected void onCreate(Bundle savedInstanceState) { super.onCreate(save
ThinkPhp5 如何引用公共文件里边的函数
把一些公共的函数写在一个文件中,然后引用 公共文件名称只能是:function.php 第一步:创建文件function.php 第二步:把文件function.php放到application\extra\中 其它网页完全不用引用这个文件,只要把这个文件放到这里,就会自动引用
Android组件通信
1、Intent启动Activity的启动方式有显式启动和隐式启动,此demo中使用显式启动的方法,启动步骤如下: (1) 注册两个Activity以及主activity中的Intent-filter; (2) 在主Activity中创建一个Intent对象; (3) 调用startActivity(Intent &)启动新Activity; 2、设计一个主Activity和一个子Ac
Android中一个Activty控制另一个Activity的函数及变量
在Android中,有时候我们需要在当前的Activity结束掉堆栈中其他的Activity,比如:Activity A,B,C,D 在堆栈中的顺序如下: A->B->C->D,假如我们现在处于Activity D,我们想在D中调用A或B或C的finish()函数,或者是对Activity A,B,C中的某个变量进行操作的话,可以用一下方法:假如Activity A 中有 函数fun, boole
【ASP.NET】如何使用类创建公共函数,在不同ASP.NET页面间重复调用
为了减少代码冗余,应将公共函数写在类中,供不同ASP.NET页面调用。 1,先新建一个类,并在类中添加函数逻辑 namespace public_function_demo { public class MyFunction { public static string tbName(string tbNo) {
TabHost中跳转到指定Tab页问题
最近在使用TabHost的时候遇到一个问题:TabHost添加了4个Activity作为tab页面,我们从左至右的顺序称呼它们为tab1,tab2,tab3,tab4。可是每次进入TabHost页面的时候,不管我进来的时候点击的是指向哪个Activity的跳转,tab1的Activity总会首先被执行。可是我希望的效果是,我点击tab2的跳转,我就只希望执行tab2的Activity。分析:我看了
Laravel5中使用自定义公共函数,全局使用
在任意位置创建一个php文件,名字任意,因为我们会通过composer自动加载机制引入这个文件。 例:在app目录下创建一个helpers.php文件,在里面书写一个测试方法<?phpfunction test(){ return 'helpers'; }修改composer.json文件,在autoload里加入files字段,值就填上一步创建php文件的路径及文件名。{ "au