0

我已经搜索过,我知道似乎有些人不喜欢在选项卡中使用活动,但超越了这一点......我将如何重新启动选项卡式活动,同时仍然保持选项卡可见?我在选项卡中有一个活动,我使用菜单创建一个新活动来更新选项卡的活动显示信息,当我从菜单活动返回时,我希望新信息显示在选项卡的活动中。我正在使用菜单选项中的 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; 
  } 
  } 
 }
4

5 回答 5

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));
    }
于 2011-03-10T13:59:14.293 回答
0

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

于 2011-10-30T22:32:24.500 回答
0

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

于 2010-01-13T16:26:30.597 回答
0

有些人不喜欢在标签中使用活动

你好!我是“一些人”!

如何重新启动选项卡式活动,同时仍保持选项卡可见?

你不知道,AFAIK。

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

当然,如果您有Views选项卡而不是 ,那么进行这种刷新可能会更容易Activities,这是“有些人不喜欢在选项卡中使用活动”的原因之一。

于 2010-01-13T13:11:54.350 回答
0

我建议你做这样的事情(不扩展 TABACTIVITY):

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时,由于activity已经在运行,所以只会调用onResume方法,这样每次tab改变时,都会调用ONRESUME方法。这样您就可以在 onResume 方法中进行所有更新。

于 2012-01-24T13:42:20.077 回答