2010-01-13 2 views
0

Я искал, и я знаю, что некоторые люди недовольны использованием действий в пределах вкладок, но переходя мимо этого ... как я могу перезапустить вкладку, пока сохраняю все вкладки? У меня есть активность на вкладке, я использую это меню для создания нового действия для обновления отображаемой информации о вкладке, когда я возвращаюсь из операции меню, я хочу, чтобы новая информация отображалась в действии вкладки. Я использую startActivityForResult() из меню, но когда я возвращаюсь и пытаюсь перезапустить активность ... он вытирает вкладки выше (я думаю, как и ожидалось, но я хочу повторно запустить обновленную активность на вкладке) ,Android: Как перезапустить активность в табусте?

Создание закладки:

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

Hah, привет "некоторые люди". Я на самом деле специально думал о вас, когда писал это, поскольку ваши сообщения - это те, с которыми я столкнулся (спасибо, кстати, за все знания, которыми вы делитесь со всеми). Поэтому я прокомментировал еще один ответ, который далее объясняет, что я пытаюсь сделать. Я еще не настолько хорош в терминологии, но считаю, что я использую представление в своей деятельности ... Я думаю: protected void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.hometab); TextView name = (TextView) findViewById (R.id.home_name); и т. д. Любой способ обновления этих объектов? –

+1

Думаю, у меня это есть. В возврате onActivityResult() я могу просто обновить поля Textview, просто запросив базу данных и обновив Textview, используя .setText(). Просто ... жаль, что я этого не видел. –

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 являются Intents уже определены. Флаг указывает, что при вызове startActivity, когда действие уже запущено, будет вызываться только метод onResume. Таким образом, каждый раз, когда вкладка изменяется, вызывается метод ONRESUME. Таким образом вы можете сделать все свои обновления внутри метода onResume.

Смежные вопросы