2010-01-13 55 views
0

我搜索了一下,我知道似乎有些人對使用標籤內的活動感到不滿,但移動過去......如何重新啓動標籤式活動,同時仍然保持標籤可見?我有一個選項卡中的活動,我使用菜單創建一個新活動來更新選項卡的活動顯示信息,當我從菜單活動返回時,我希望新信息顯示在選項卡的活動中。我從菜單選擇中使用startActivityForResult(),但是當我返回並嘗試重新啓動活動時...它抹掉了上面的選項卡(我猜想是按預期的那樣,但我想在選項卡中重新啓動刷新的活動) 。Android:如何重新啓動tabhost內的活動?

創建標籤:在標籤的活動菜單活動

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; 
    } 
    } 
} 

回答

0

有些人看不慣使用標籤

內 活動

嗨!我是「一些人」!

我怎麼會重啓選項卡式活動,同時仍保持標籤可見?

你沒有,AFAIK。

當然,由於您是finish()的人,並且重新開始活動,您可以通過註釋掉這兩行代碼來輕鬆地阻止該活動的發生。你的問題不在於你失去了選項卡 - 而是因爲你可能更好的方式去做任何你想要實現的「更新」,就是用大錘砸碎你的活動。

當然,如果您的選項卡爲Views而不是Activities,那麼進行此類刷新可能會更容易,這是「有些人對使用標籤頁內的活動不滿意」的原因之一。

+0

哈,嗨「有些人」。當我寫這篇文章時,我確實特別想到你,因爲你的帖子是我遇到的帖子(順便說一下,感謝你與大家分享的所有知識)。所以我評論了另一個解釋我想要做的事情的答案。我對這個術語還不是很瞭解,但我相信我正在使用活動中的視圖...我認爲: 保護無效onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.hometab); TextView name =(TextView)findViewById(R.id.home_name);等 任何方式刷新這些對象? –

+1

我想我有。在onActivityResult()返回上,我可以通過查詢數據庫並使用.setText()更新Textview來更新Textview字段。簡單...對不起,我沒有看到它。 –

0

是的,我認爲可以肯定地說,在選項卡中完成並重新啓動自己作爲活動不是受支持的用例。相反,當你知道「配置文件已更新」時,是否有更好的更細粒度的方式來刷新其狀態?例如,查詢內容提供者以刷新活動中表示的信息?這完全取決於活動中表示的信息。

+0

顯示配置文件信息的活動從數據庫中提取信息。當用戶決定更新配置文件信息時,一個新的活動開始,用戶更改數據庫,然後該活動結束並返回到之前的「標籤活動」,該活動現在正在顯示陳舊的信息。我將如何顯示更新的信息?我應該保留全局遊標並在更新任務返回時重新查詢它嗎?是否有內置的方式來刷新「textview」字段?感謝您的任何意見。 –

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)); 
    } 
0

嗯......我不認爲活動必然是個好主意要麼。但是請注意,任何活動都可以註冊廣播接收器,並且任何活動都可以發送廣播....也許您可以註冊廣播接收器並以此方式進行通信。

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已經定義意圖。 該標誌表明,當您調用startActivity時,由於活動已在運行,因此只會調用onResume方法 這樣,每次選項卡更改時,都會調用ONRESUME方法。通過這種方式,您可以在onResume方法內完成所有更新。