Android: Как перезапустить активность на вкладке? - PullRequest
0 голосов
/ 13 января 2010

Я искал и знаю, что некоторые люди недовольны использованием действий на вкладках, но переходя мимо этого ... как бы я перезапустил действие с вкладками, сохраняя вкладки видимыми? У меня есть действие на вкладке, я использую меню для создания нового действия, чтобы обновить информацию, отображаемую на вкладке, когда я возвращаюсь из действия в меню, я хочу, чтобы новая информация отображалась в действии вкладки. Я использую 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 ]

1 голос
/ 10 марта 2011

Вот решение:

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 голосов
/ 24 января 2012

Я предлагаю вам сделать что-то вроде этого (НЕ РАСШИРЯЯ ТАБАЧНОСТЬ):

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.

0 голосов
/ 31 октября 2011

Ну ... я тоже не думаю, что занятия - это хорошая идея. Однако учтите, что любое действие может зарегистрировать получателя широковещания, а любое действие может отправлять широковещательные сообщения ... Возможно, вы могли бы зарегистрировать получателя широковещания и вместо этого общаться.

0 голосов
/ 13 января 2010

Да, я думаю, можно с уверенностью сказать, что завершение и перезапуск себя в качестве Действия на вкладке не является поддерживаемым вариантом использования. Вместо этого, когда вы знаете, что «профиль был обновлен», есть ли лучший, более точный способ обновить его состояние? Например, запросить поставщика контента для обновления информации, представленной в действии? Все зависит от того, какая информация представлена ​​в Деятельности.

0 голосов
/ 13 января 2010

некоторые люди недовольны использованием действия во вкладках

Привет! Я "некоторые люди"!

как бы я возобновил работу с вкладками, сохраняя вкладки видимыми?

Ты не, AFAIK.

Конечно, так как вы - тот, кто finish() занимается и перезапускает действие, вы можете легко остановить это, закомментировав эти две строки кода. Ваша проблема не в том, что вы теряете вкладки, а в том, что вы разбиваете свою деятельность кувалдой, когда, возможно, есть лучший способ выполнить любое «обновление», которого вы пытаетесь достичь.

Конечно, выполнять такого рода обновление, вероятно, было бы проще, если бы у вас было Views для вкладок вместо Activities, что является одной из причин, по которой "некоторые люди недовольны использованием действий во вкладках".

...