Как изменить намерение в TabSpec

Вот сценарий: у меня есть действие с 4 вкладками, каждая вкладка с другим намерением, каждое намерение с другим действием. Работает отлично.

Что мне нужно, так это как-то изменить намерение на одной из вкладок. Это было бы так же просто, как добавить дополнительные параметры к намерению, которое используется в TabSpec.setContent(intent), но я не нашел способа получить это намерение, чтобы изменить его.

Конкретное действие, которое я пытаюсь сделать, это: из другого действия (находящегося внутри содержимого другой вкладки) я вызываю его родителя (TabActivity), чтобы открыть другую вкладку И добавить некоторые пользовательские данные в эту вкладку. действие.

Я могу изменить вкладку без проблем, но я не нашел способа передать дополнительные параметры из одного действия в другое, поскольку исходное намерение, использованное для создания TabSpec, не имело дополнительных параметров.

Я подхожу к этому неправильно?

Есть ли способ заменить намерение содержимого TabSpec?

Спасибо !


person Draiken    schedule 10.10.2011    source источник


Ответы (3)


Если вы просто пытаетесь найти способ передачи значений между действиями, вы можете переопределить класс Application.

Способ использования контекста приложения.

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

MyApplication appContext = (MyApplication) getApplicationContext();

Чтобы это работало, вам нужно добавить это в тег приложения файла манифеста.

 android:name=".MyApplication"

Этот метод используется для передачи значений по приложению, когда отправка через намерение невозможна.

Чтобы удалить вкладку, вам нужно будет использовать метод clearAllTabs() и снова добавить вкладки. Приведенный выше код должен быть лучше.

person blessenm    schedule 10.10.2011
comment
То, что мне нужно, очень специфично, в основном, когда ListView пуст, он предоставляет кнопку для продолжения навигации, но эта навигация передается в TabActivity, который затем переключает вкладку, но он также должен передавать некоторые дополнительные аргументы для этого нового Мероприятия. Разве создание Application для этого не является излишним? - person Draiken; 10.10.2011
comment
Вы не создаете приложение, вы подклассифицируете его для хранения своих значений. Существует приложение по умолчанию, даже если вы не переопределяете его. - person blessenm; 10.10.2011

В моем случае я сохраняю ссылку на намерение в TabActivity.

mGalleryTabIntent = new Intent(this, AnActivity.class);
spec = getTabHost().newTabSpec(TAB_GALLERY).setIndicator(res.getString(R.string.footer_gallery),res.getDrawable(R.drawable.gallery_icon_sel)).setContent(mGalleryTabIntent); 

public Intent getStoredTabIntent(){
    return mGalleryTabIntent;
  }

Затем, когда из ребенка я хочу перейти на другую вкладку, передавая Extra вместе с Intent

    MainTabActivity parent = (MainTabActivity)getParent();
    parent.getStoredTabIntent().putExtra(AnActivity.START_VIEW, AnActivity.PAGE_TWO);

    //Navigate to the tab
    parent.getTabHost().setCurrentTabByTag(AnActivity.TAB_GALLERY);

Затем в AnActivity onCreate

Bundle extras = getIntent().getExtras();
if(extras != null && extras.containsKey(START_VIEW)){
  switch (extras.getInt(START_VIEW)) {
    case PAGE_TWO:
      doSomething();
      break;

    default:
      break;
  }

  //Erase the Extra so that navigating to this Tab always displays the standard view unless specified otherwise
  MainTabActivity parent = (MainTabActivity)getParent();
  parent.getStoredTabIntent().putExtra(AnActivity.START_VIEW, "");
}else{
  doStandardStuff();
}

Решение Application также хорошо, но я не думаю, что оно мне понадобится для чего-то еще, поэтому я предпочел бы придерживаться Activity.

person Maragues    schedule 09.11.2011
comment
Да, я закончил тем, что реализовал это почти так же, как и вы. Это был конкретный случай, поэтому я добавил конкретное решение. Благодарность ! - person Draiken; 10.11.2011

TabSpec tabspec1;

private void createTabHost() {

    // initialize tabHost
    tabHost = (TabHost) this.findViewById(R.id.tabhost1);
    tabHost.setup(this.getLocalActivityManager());

    // create tab1
    Intent intent = new Intent(this, AnotherActivity.class).addFlags(
            Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("myData",
                ObjData);
    tabspec1 = tabHost.newTabSpec("tab1")
            .setIndicator(Utilities
                    .prepareTabView(this, "Title"))
            .setContent(intent);
    tabHost.addTab(tabspec1 );

    // create tab2
       ...
}

метод, который изменяет содержимое этого действия, размещенного на вашей вкладке:

private void reloadTabSpec1() {

        Intent i = new Intent(this, AnotherActivity.class).addFlags(
                Intent.FLAG_ACTIVITY_CLEAR_TOP);
        i.putExtra("myData", ObjData);
        tabspec1.setContent(i);

        // needed for refresh :(
        tabHost.setCurrentTabByTag(tabspec2.getTag());
        tabHost.setCurrentTabByTag(tabspec1.getTag());

}
person Bobs    schedule 10.10.2011
comment
Таким образом, вы храните все экземпляры TabSpecs в TabActivity? Это хорошая практика? - person Draiken; 10.10.2011