【问题标题】:Android: How to restart an activity within a tabhost?Android:如何重新启动标签主机中的活动?
【发布时间】:2010-01-13 05:08:24
【问题描述】:

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

【问题讨论】:

    标签: android tabs android-activity restart


    【解决方案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));
        }
    

    【讨论】:

      【解决方案2】:

      有些人不喜欢使用 标签内的活动

      嗨!我是“某些人”!

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

      你不知道,AFAIK。

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

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

      【讨论】:

      • 哈,嗨,“有些人”。实际上,当我写这篇文章时,我特别想着你,因为你的帖子是我遇到的(顺便说一句,感谢你与大家分享的所有知识)。所以我评论了另一个答案,进一步解释了我想要做什么。我对术语还不是很好,但我相信我在活动中使用了一个视图......我认为:protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.hometab); TextView name = (TextView) findViewById(R.id.home_name);等等。有什么方法可以刷新这些对象?
      • 我想我有。在 onActivityResult() 返回时,我可以通过查询数据库并使用 .setText() 更新 Textview 来更新 Textview 字段。很简单……抱歉我没看到。
      【解决方案3】:

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

      【讨论】:

      • 显示配置文件信息的活动从数据库中提取信息。当用户决定更新配置文件信息时,新的活动开始,用户进行数据库更改,然后该活动结束并返回到现在显示陈旧信息的先前“选项卡式活动”。我将如何显示更新的信息?我应该保留一个全局游标并在更新任务返回时重新查询它吗?是否有刷新“textview”字段的内置方法?感谢您的任何意见。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我建议你做这样的事情(不延长 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 方法 这样,每次选项卡更改时,都会调用 ONRESUME 方法。这样您就可以在 onResume 方法中进行所有更新。

        【讨论】:

          最近更新 更多