Android:如何重新启动tabhost中的活动?

时间:2010-01-13 05:08:25

标签: android tabs android-activity restart

我已经搜索过了,我知道似乎有些人不喜欢使用标签中的活动,但是过去了...如何在保持标签可见的同时重新启动标签式活动?我在选项卡中有一个活动,我使用菜单创建一个新活动来更新选项卡的活动显示信息,当我从菜单活动返回时,我希望新信息显示在选项卡的活动中。我从菜单选项中使用startActivityForResult(),但是当我返回并尝试重新启动活动时...它会清除上面的选项卡(我猜是按预期,但我想在选项卡中重新启动刷新的活动)

创建标签:

  TabHost host = getTabHost();
  Intent home_intent = new Intent(constants.HOME_ACTION,
    null, this, homeTab.class);
  Intent inbox_intent = new Intent(constants.INBOX_ACTION,
    null, this, inboxTab.class);
  Intent stats_intent = new Intent(constants.STATS_ACTION, null,
    this, infoTab.class);

  host.addTab(host.newTabSpec(constants.HOME_TAG)
    .setIndicator(getText(R.string.home_label),
      getResources().getDrawable(R.drawable.icon))
    .setContent(home_intent));
  host.addTab(host.newTabSpec(constants.INBOX_TAG)
    .setIndicator(getText(R.string.inbox_label),
      getResources().getDrawable(R.drawable.icon))
    .setContent(inbox_intent));
  host.addTab(host.newTabSpec(constants.STATS_TAG)
    .setIndicator(getText(R.string.stats_label),
      getResources().getDrawable(R.drawable.icon)).setContent(
      stats_intent));

从选项卡活动中的菜单活动返回(更新数据库信息):

  public void onActivityResult(int requestCode, int resultCode, Intent data) {     
  super.onActivityResult(requestCode, resultCode, data); 
  switch(requestCode) { 
  case (constants.ACTIVITY_REQUEST_CODE_UPDATE_PROFILE) : { 
   if (resultCode == Activity.RESULT_OK) { 
    boolean profileUpdated = data.getBooleanExtra(constants.ACTIVITY_BUNDLE_UPDATE_PROFILE, false);
    Log.d(LOG_TAG, "activity returned with " + profileUpdated);
    // Check to see if we updated our profile to refresh the screen
    if(profileUpdated == true){
     // Refresh the screen with the new info
     homeTab.this.finish();
     this.startActivity(getIntent());
    }
   } 
   break; 
  } 
  } 
 }

5 个答案:

答案 0 :(得分:1)

以下是解决方案:

tabHost.setOnTabChangedListener(this);
public void onTabChanged(String tabId) {
        LocalActivityManager manager = getLocalActivityManager();
        manager.destroyActivity("ID_1", true);
        manager.startActivity("ID_1", new Intent(this, YourMyActivity.class));
    }

答案 1 :(得分:0)

  有些人在使用时皱眉头   标签内的活动

嗨!我是“有些人”!

  

如何在保持标签可见的同时重新启动标签式活动?

你没有,AFAIK。

当然,既然你是finish()并且重新启动活动的人,你可以通过注释掉这两行代码来轻松阻止这种情况发生。你的问题并不在于你正在失去标签 - 这就是你用大锤粉碎你的活动时,可能有更好的方法来做你想要实现的任何“刷新”。

当然,如果您的标签Views而不是Activities,则进行此类刷新可能会更容易,这是“有些人不喜欢在标签中使用活动”的原因之一

答案 2 :(得分:0)

是的,我认为可以说完成并重新启动自己作为标签中的活动不是支持的用例。相反,当您知道“配置文件已更新”时,是否有更好的细粒度方式来刷新其状态? E.g查询内容提供商以刷新活动中表示的信息?这完全取决于活动中表示的信息。

答案 3 :(得分:0)

嗯......我认为活动也不一定是好主意。但请注意,任何活动都可以注册广播接收器,任何活动都可以发送广播....也许您可以注册广播接收器并以此方式进行通信。

答案 4 :(得分:0)

我建议你做这样的事情(不要延长活动度):

mlam = new LocalActivityManager(this, false);
final TabHost tabHost = (TabHost) findViewById(R.id.tabhostfaces);
mlam.dispatchCreate(bundle);
mlam.dispatchResume();
mlam.dispatchPause(isFinishing());
tabHost.setup(mlam);

tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    @Override
    public void onTabChanged(String tabId) {
        String currentTag = mTabHost.getCurrentTabTag();
        if(currentTag.equals("tab_ntflist")){
            ntfreglst.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            mlam.startActivity(currentTag, new Intent(ntfreglst));
        } else if(currentTag.equals("tab_profile")){
            pflvw.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            mlam.startActivity(currentTag, new Intent(pflvw));
        }
    }
});

其中ntfreglst和pflvw是已定义的Intent。 该标志表示,当您调用startActivity时,由于活动已在运行,因此只会调用onResume方法 这样,每次选项卡更改时,都会调用ONRESUME方法。这样您就可以在onResume方法中进行所有更新。