2010-10-06 15 views
19

Następująca sytuacja: Mam TabActivity z np. trzy zakładki, TabA, TabB, TabC.Android. Jak zmienić działanie w Tab

Istnieje przycisk w działaniu (Act_C_1) TabC. Więc jeśli użytkownik kliknie na ten przycisk, inna czynność (Act_C_2) powinna nastąpić w TabC.

Z góry dziękuję za wszelkie sugestie/pomysły.

Mur

UPD:

Oto mój kod

TabActivity z trzech działań:

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

} 

Activity 'Act_C_1' lub 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));    
    }   
} 
+1

Proszę sprawdzić ten link: [Android: Jak mają wiele działań w ramach jednej karcie TabActivity] (http://gamma-point.com/content/android-how-have-multiple-activities-under -single-tab-tabactivity) – Ian

Odpowiedz

-2

obsłużyć zdarzenia onClick dla przycisku

finish() działalność Dodaj metodę startActivity rozpocząć inną czynność.

Dzięki

+0

Dobra sugestia, ale to nie działa dzięki TabActivity ... przynajmniej przeze mnie. – Tima

+0

Witam Proszę zamieścić swój fragment kodu ... Spróbuję go edytować. –

+0

Zawarłem ważną część mojego kodu. "Nie działa" jest nieprawidłowe, ale jeśli zrobię to w ten sposób, działanie karty zostanie zakończone. Co chcę mieć, że tylko działanie w ramach tabactivity zostanie zakończone, a inne zaczną się w zakładce. – Tima

-1

Wystarczy dodać to na wszystkich kartach:

yourTabHost.getChildAt(0).setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
     getTabHost().setCurrentTab(0); 
    } 
}); 
24

czynności w karcie można włączyć w następujący sposób.

najpierw niech nam zrozumieć przepływ:

  1. Mamy w przyjmującym Tab, aktywność (słownie liście), z której musimy przejść do następnego Aktywny (powiedzmy dane dla klikniętego elementu) pod ta sama karta. W tym celu możemy użyć pojęcia zamiany aktywności. Ponadto ustawiamy flagi dla wybranej karty i inne, wiedząc, że szczegóły są teraz wyświetlane. Po ponownym naciśnięciu powinniśmy pobrać poprzednią aktywność z tej samej karty. W tym celu zamiast ponownie zastępować działanie, możemy odświeżyć zakładkę, używając konkretnej flagi dla wybranej karty. Także jeśli flaga do pokaż szczegóły prawda pójdziemy na listę w tej samej karcie, albo pójdziemy aktywność przed tabwidget (normalnego użytkowania onBackPressed)

Kod może być następująca ..

  1. Aby przejść od listy do szczegółów ...

(może to być w 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. Po powrocie wciśnięty odbywa nam przesłonić na BackPressed w każdej aktywności na karcie, aby przejść do listy ponownie ze szczegółami ekran

    @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(); 
        } 
    } 
    

najważniejszą częścią tutaj jest Constants.LIST_ACTIVITY = 1; wskazuje, w której zakładce się znajdujemy, więc odpowiednie działania będą miały wartość równą 0,1,2 ... itd.

Ponownie, aby załadować poprawną listę (Activty), gdy działanie karty zostanie odświeżone, musimy uwzględnić to w TabWidget onCreate po stworzeniu zakładek

tabHost.setCurrentTab(Constants.LIST_ACTIVITY); 
+2

+1, tylko komunikat - "kontekst" powyżej odnosi się do zamkniętej czynności, a nie do kontenera (TabActivity). No i zastanawiam się, dlaczego nie śledzić projektowania intencji Androida i używać zamiast tego Constants.LIST_ACTIVITY .. – kellogs

+0

ya poprawny kontekst odnosi się do zawartych działań obejmujących karty. –

+0

Nie zgadzam się, kontekst * oznacza * TabActivity, w przeciwnym razie nie można przesłać go do ActivityGroup. –

0

Wystarczy użyć Intent.FLAG_ACTIVITY_CLEAR_TOP flagę zastąpić aktywność na karcie niezbędny.

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); 
Powiązane problemy