【问题标题】:setCurrentTab of a tabHosttabHost 的 setCurrentTab
【发布时间】:2011-06-21 13:09:27
【问题描述】:

我在问我们是否可以从另一个类而不是包含 tabhost 和 tabspecs 的类调用 tabhost 上的 setCurrentTab?

我们可以放吗

tabHost.setCurrentTab(1);

在另一个班级而不是这个班级:

public class Main extends TabActivity{

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.v("", "Welcome in Main");
    setContentView(R.layout.tab);

    TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost);  // Le TabHost a des Tabs

    TabSpec firstTabSpec = tabHost.newTabSpec("tid1");  // TabSpec: new tab - TabSpec : setContent to the tab
    firstTabSpec.setIndicator("Informations", getResources().getDrawable(R.drawable.database)).setContent(new Intent(this,FirstTab.class));
    tabHost.addTab(firstTabSpec);

    TabSpec secondTabSpec = tabHost.newTabSpec("tid1");
    secondTabSpec.setIndicator("Graphiques", getResources().getDrawable(R.drawable.chart)).setContent(new Intent(this,SecondTab.class));
    tabHost.addTab(secondTabSpec);

    TabSpec thirdTabSpec = tabHost.newTabSpec("tid1");  // tid1 is firstTabSpec Id (used to access outside)
    thirdTabSpec.setIndicator("Réglages", getResources().getDrawable(R.drawable.settings)).setContent(new Intent(this,ThirdTab.class));
    tabHost.addTab(thirdTabSpec);
}

}

我们可以把它变成一个静态变量吗?我们如何才能做到这一点?

感谢您的关注!

【问题讨论】:

  • 写更多关于你想要达到的目标,因为看起来你正在考虑非常糟糕的编程......当使用包含对 Context 的引用的静态变量(例如 TabHost)时,你可能会导致内存泄漏.为什么要从其他类更改当前选项卡以及哪些类会这样做?
  • 我在第一个视图中有一个按钮,如果我们按下它,我想看到第二个视图(每个视图都在自己的选项卡上).. 就像我们按下选项卡一样...

标签: android static android-tabhost tabactivity


【解决方案1】:

你当然可以。对于您的情况,单例的 TabActivity 可能效果最好。例如:

public class Main extends TabActivity{
    private staic Main theInstance;

    public static getInstance() {
        return Main.theInstance;
    }

    public Main() {
        Main.theInstance = this;
    }

    // The rest of your code here.
}

然后,从另一个班级,您可以调用:

Main.getInstance().getTabHost().setCurrentTab(1);

注意:我提供的不是完整的单例实现,但对于您正在做的事情应该足够了。根据您设置选项卡的类,您可能需要在调用 setCurrentTab() 方法之前检查 Main.getInstance() 是否不为空。

【讨论】:

  • 不是 Main.getInstance().tabHost.setCurrentTab(1); ???还是instread的“this”,我必须返回TabHost??
  • @clement,很好,应该是Main.getInstance().getTabHost().setCurrentTab(1);
  • 我必须实现一个getTabHost,但我不能返回一个tabHost...我如何声明它?作为一个公共静态呢?
  • 好的,我在 onCreate 之前将 TabHost 作为私有,并且该方法只返回 tabHost...
【解决方案2】:

但是,如果您在另一个活动中,您无论如何都不会看到这些选项卡,对吗?

我在 ListView 上遇到了类似的问题,它启动了 tabHost 活动 onItemClick 以使其正常工作,我通过意图传递了我想显示的 tabNumber,然后使用 setCurrentTab 将当前选项卡设置为传递的选项卡编号。不确定这是否适合您。

编辑:我是这样做的:

Intent i = new Intent(this, TabHostActivity.class);
i.putExtra("TabNumber", tabNumberToBeSelected); //tabNumberToBeSelected is an int
startActivity(i);

然后在 tabHost 活动中:

int tabNumber = getIntent().getIntExtra("TabNumber", 0);

//tabHost code goes here

tabHost.setCurrentTab(tabNumber);    

【讨论】:

  • 我想在按下按钮时看到标签!你怎么能通过 tabNumber 槽的意图?意图是这样的:new Intent(this,ThirdTab.class)
【解决方案3】:

在您的活动 FirstTab、SecondTab 和 ThirdTab 中,您应该使用如下方法:

boolean setCurrentTab(int i) {
    if (getParent() instanceof Main) {
        ((Main) getParent()).getTabHost().setCurrentTab(i);
        return true;
    }
    return false;
}

【讨论】:

  • 因此,您可以从选项卡内的活动中执行 setCurrentTab。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多