Андроид. Как изменить активность на вкладке

Следующая ситуация: у меня есть TabActivity, например. три вкладки, TabA, TabB, TabC.

Есть кнопка в действии (Act_C_1) TabC. Поэтому, если пользователь нажмет на эту кнопку, в TabC должно произойти другое действие (Act_C_2).

Я заранее благодарю вас за любые предложения / или идеи.

Мур

ОБНОВЛЕНИЕ:

Вот мой код

TabActivity с тремя действиями:

public class TabScreen extends TabActivity
{
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.tab_menu);

        TabHost tabHost = getTabHost();  // The activity TabHost
        TabHost.TabSpec spec;  // Resusable TabSpec for each tab
        Intent intent;  // Reusable Intent for each tab

        intent = new Intent().setClass(this, SecondActivity.class);

        // Initialize a TabSpec for each tab and add it to the TabHost
        spec = tabHost.newTabSpec("tab_1").setIndicator("Tab1",null).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, ThirdActivity.class);
        // Initialize a TabSpec for each tab and add it to the TabHost
        spec = tabHost.newTabSpec("tab_2").setIndicator("Tab2",null).setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, FourthActivity.class);
        spec = tabHost.newTabSpec("tab_3").setIndicator("Tab3",null).setContent(intent);
        tabHost.addTab(spec);
    }

}

Активность Act_C_1 или FourthActivity.java:

public class FourthActivity extends Activity implements OnClickListener
{
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fourth);

        Button BtnWeiter = (Button)findViewById(R.id.BtnWeiter);
        BtnWeiter.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) 
    {                    
        // I also tried to use LocalActivityManager
        // TabActivity parentTabActivity = (TabActivity) getParent();            
        // LocalActivityManager manager = parentTabActivity.getLocalActivityManager();
        // manager.destroyActivity("tab_3", true);
        // manager.startActivity("tab_3", new Intent(this, FourthActivity.class));
        finish();
        startActivity(new Intent(this, FourthActivity.class));            
    }        
}

person Tima    schedule 06.10.2010    source источник
comment
Пожалуйста, проверьте эту ссылку: Android: как иметь несколько действий на одной вкладке TabActivity   -  person Kannan Suresh    schedule 25.11.2011


Ответы (4)


Действия на вкладке можно переключать следующим образом.

Сначала давайте разберемся с потоком:

  1. У нас есть Tab host , активность (скажем, список), из которой нам нужно перейти к следующей Activity (скажем, детали для выбранного элемента) на той же вкладке. Для этого мы можем использовать концепцию замены активности. Также установить флаги для выбранной вкладки и другие, чтобы знать, что сейчас отображаются подробности.

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

Код может быть следующим..

  1. Для перехода от списка к деталям...

(Это может быть в onClickListener)

private OnClickListener textListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        Constants.SHOW_DETAILS = true;
        Intent intent = new Intent(context, DetailsActivity.class);
        replaceContentView("activity3", intent);
        }
};

public void replaceContentView(String id, Intent newIntent) {
    View view = ((ActivityGroup) context)
            .getLocalActivityManager()
            .startActivity(id,
                    newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
            .getDecorView();
    ((Activity) context).setContentView(view);

}
  1. Когда обратное нажатие выполнено, мы переопределяем BackPressed в каждом действии на вкладке, чтобы снова перейти к списку с экрана сведений.

    @Override
      public void onBackPressed() {
    // TODO Auto-generated method stub
    super.onBackPressed();
    if (MathHelper.SHOW_DETAILS) {
        Log.e("back", "pressed accepted");
        Constants.LIST_ACTIVITY = 1;
        Constants.SHOW_DETAILS = false;
        Intent intent = new Intent(this, Tab_widget.class);
        startActivity(intent);
        finish();
      }
     }
    

Самая важная часть здесь — это Constants.LIST_ACTIVITY = 1; он указывает, на какой вкладке мы находимся, поэтому соответствующие действия будут иметь значение 0,1,2... и т. д.

Опять же, чтобы загрузить правильный список (Activty) при обновлении активности вкладки, мы должны включить это в TabWidget onCreate после создания вкладок.

tabHost.setCurrentTab(Constants.LIST_ACTIVITY);
person Vicky Kapadia    schedule 26.07.2011
comment
+1, просто примечание: «контекст» выше относится к содержащемуся действию, а не к контейнеру (TabActivity). О, и мне интересно, почему бы не следовать дизайну намерений Android и вместо этого использовать Constants.LIST_ACTIVITY.. - person kellogs; 14.08.2011
comment
правильно, контекст относится к содержащимся действиям, содержащим вкладки. - person Vicky Kapadia; 16.08.2011
comment
Я не согласен, контекст является TabActivity, иначе вы не можете привести его к ActivityGroup. - person Benoit Duffez; 17.08.2011
comment
Не могу больше редактировать, извините. Используйте (ActivityGroup ((Activity) context).getParent()).getLocalActivityManager() - person Benoit Duffez; 17.08.2011
comment
Привет, Бику, на самом деле у меня было 4 действия на вкладке, и каждое из них, вместо того, чтобы расширять его по действию, я расширил ActivityGroup. Таким образом, контекст предназначен для внутренних действий, а не для TabActivity. Мы снова заменяем представление внутренней активности на новое (здесь из DetailsActivity.class). Итак, снова это показывает, что это не может быть TabActivity. Опять же, контекст относится к контексту внутренней активности, поэтому нет необходимости редактировать его и использовать (Activity), а затем (ActivityGroup) . достаточно только последнего. - person Vicky Kapadia; 19.08.2011
comment
если вы не возражаете, я спрошу.. как вы объявляете Constants.LIST_ACTIVITY, когда я пытаюсь поместить его в свой код.. не во время работы, а во время кодирования... - person lemoncodes; 27.08.2012
comment
Constants.LIST_ACTVITY — это статическая переменная в классе констант, инициализированная значением, которое указывает вкладку по умолчанию, выбранную на вашем узле вкладок. - person Vicky Kapadia; 03.09.2012

Просто используйте флаг Intent.FLAG_ACTIVITY_CLEAR_TOP, чтобы заменить действие на нужную вкладку.

intent = new Intent().setClass(this, YourActivity.class);
spec   = tabHost.newTabSpec("tab1").setIndicator("Tab1",null)
        .setContent(intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
tabHost.addTab(spec);
person Dimon    schedule 23.04.2015

Просто добавьте это для всех вкладок:

yourTabHost.getChildAt(0).setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        getTabHost().setCurrentTab(0);
    }
});
person Help    schedule 13.04.2011

Обработка события onClick для кнопки

Finish() действия Добавьте метод startActivity для запуска другого действия.

Спасибо

person success_anil    schedule 06.10.2010
comment
Хорошее предложение, но TabActivity не работает... по крайней мере, у меня. - person Tima; 06.10.2010
comment
Я включил важную часть моего кода. «Не работает» неправильно, но если я сделаю это таким образом, активность вкладки будет завершена. Что я хочу иметь, так это то, что только действие в пределах вкладки будет завершено, а другое будет запущено в пределах вкладки. - person Tima; 07.10.2010
comment
Хм.. Я не против дизайна вашего приложения... Насколько я знаю, если вы хотите добиться того же эффекта... используйте кнопки, которые будут выглядеть как вкладки, и тогда у вас будет полный контроль над тем, какие действия вы должны начать или закончить. Вкладки работают только таким образом, что если вы попытаетесь вызвать новую активность из активности, отображаемой внутри вкладки, новая активность займет весь экран, даже вкладки. - person success_anil; 07.10.2010
comment
Похоже, это просто завершает действие и запускает новое, что не является целью. См. предложение выше. - person Kyle Clegg; 08.03.2012