2009-08-20 13 views
33

Oto umowa. Mam aplikację z trzema zakładkami. Poprzez różne interakcje z elementami w zakładkach kończę uruchamianie innych działań. Klient sprawdził to i chciałby, aby czynności uruchomione były "wewnątrz" kart, więc karty pozostaną widoczne i jeśli użytkownik kliknie kartę, powróci do pierwotnej czynności zdefiniowanej w funkcji setContent. Czy to jest możliwe i jak mam to zrobić z innych działań? (tzn. czynności podrzędne, nie te, które definiują TabHost i mają dostęp do zestawu ustawień).Uruchamianie działań w zakładce w Androidzie

Odpowiedz

44

Możliwe jest uruchomienie działań w zakładkach. Dlatego ustaw zawartość tabspec na ActivityGroup zamiast zwykłej Activity. .

tabHost.addTab(tabHost.newTabSpec("Tab") 
       .setIndicator("Tab") 
       .setContent(new Intent(this, YourActivityGROUP.class) 
       .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))); 

Od wewnątrz tej ActivityGroup można rozpocząć inną działalność tak, że tylko aktualizuje contentView zakładki jesteś w

class YourActivityGROUP extends ActivityGroup{ 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     //you van get the local activitymanager to start the new activity 

     View view = getLocalActivityManager() 
           .startActivity("ReferenceName", new 
     Intent(this,YourActivity.class) 
           .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) 
           .getDecorView(); 
     this.setContentView(view); 

    } 
} 
+1

dziękuję za to ... w rzeczywistości uważam, że to powinna być właściwa droga do wprowadzenia tego rodzaju funkcjonalności, ponieważ zapewnia lepszą konserwowalność kodu. – samiq

+0

Jest jeszcze inny sposób, ale elegancki? Niezupełnie ... Zawsze można zapisać instancję klasy TabActivity w rozszerzonej klasie aplikacji (aby uniknąć globalnych zakłóceń statycznych).Gdy musisz uruchomić nowe działanie, wywołaj klasę Application, aby zwrócić instancję TabActivity i uruchomić metodę, która usuwa karty i odtwarza je, ale zastępuje bieżącą aktywność nową. Jeśli ktoś jest zainteresowany, mogę przejść do dalszych szczegółów. – glr

+0

cześć, dziękuję .. mogę wywołać nową aktywność w tej samej karcie, ale problem pojawia się po powrocie do poprzedniej aktywności. Wzywam Aktywność B z ActivityGroup A, teraz chcę ponownie przejść do ActivityGroup A. Czy możesz mi dać wskazówkę .. dziękuję .. –

0

commonsware.com jest poprawne, nie jest możliwe. Miałem podobny problem, ale to była tylko jedna aktywność, która została uruchomiona. Poświęciłem trochę mojej architekturze i usunąłem działanie uruchomione z wewnątrz karty. Umieściłem kod w widoku, a następnie dodałem ViewAnimator do działania karty. Przełknąłem przycisk Wstecz i usunąłem ten widok, jeśli jest włączony, albo niech przycisk Wstecz działa normalnie.

Udało się to na tyle dobrze, i tylko dla jednej ściśle związanej z tym aktywności nie zamierzam przestawać spać nad względami projektowymi.

11

Tutaj to moje rozwiązanie:

public class ActivityStack extends ActivityGroup { 

    private Stack<String> stack; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (stack == null) stack = new Stack<String>(); 
    //start default activity 
    push("FirstStackActivity", new Intent(this, FirstStackActivity.class)); 
    } 

    @Override 
    public void finishFromChild(Activity child) { 
    pop(); 
    } 

    @Override 
    public void onBackPressed() { 
    pop(); 
    } 


    public void push(String id, Intent intent) { 
    Window window = getLocalActivityManager().startActivity(id, intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); 
    if (window != null) { 
     stack.push(id); 
     setContentView(window.getDecorView()); 
    } 
    } 

    public void pop() { 
    if (stack.size() == 1) finish(); 
    LocalActivityManager manager = getLocalActivityManager(); 
    manager.destroyActivity(stack.pop(), true); 
    if (stack.size() > 0) { 
     Intent lastIntent = manager.getActivity(stack.peek()).getIntent(); 
     Window newWindow = manager.startActivity(stack.peek(), lastIntent); 
     setContentView(newWindow.getDecorView()); 
    } 
    } 
} 

Zakładka Uruchomienie

Intent intent = new Intent().setClass(this, ActivityStack.class); 
TabHost.TabSpec spec = tabHost.newTabSpec("tabId") 
spec.setContent(intent); 

Zadzwoń obok aktywność

public class FirstStackActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    TextView textView = new TextView(this); 
    textView.setText("First Stack Activity "); 
    textView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(); 
      intent.setClass(getParent(), SecondStackActivity .class); 
      ActivityStack activityStack = (ActivityStack) getParent(); 
      activityStack.push("SecondStackActivity", intent); 


     } 
    }); 
    setContentView(textView); 
    } 
} 

Zadzwoń obok znowu

public class SecondStackActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    TextView textView = new TextView(this); 
    textView.setText("First Stack Activity "); 
    textView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(); 
      intent.setClass(getParent(), ThirdStackActivity .class); 
      ActivityStack activityStack = (ActivityStack) getParent(); 
      activityStack.push("ThirdStackActivity", intent); 


     } 
    }); 
    setContentView(textView); 
    } 
} 

Prace na emulatorze 2.2

+1

Pamiętaj, że "ActivityGroup" jest teraz przestarzałe. – CommonsWare

+0

Ten kod działa zgodnie z oczekiwaniami. –

+0

W rzeczywistości jest dość duży błąd - jeśli zaczniesz od działania A, a następnie B (a skończysz) w działaniu A, powyższy kod faktycznie zakończy działanie B. –

0

Jak o 2 umieszczenie zakładek w tym problemu. Pierwszy 1 jest menu dolny umieszczenie zakładek, drugi jest top umieszczenie zakładek, są one różne aktywności i xml

1

można użyć

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

dla każdego działania można ustawić jako treści dla tabSpec i będzie tworzyć tę działalność za każdym razem, gdy naciśniesz na zakładce

0

Jak mogę otworzyć fragment lub działanie z pokrętła na pasku narzędzi?

import android.content.Intent; import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; import android.view.Menu; 
import android.view.MenuItem; import android.view.View; 
import android.widget.AdapterView; import android.widget.ArrayAdapter; 
import android.widget.Spinner; 


> public class MainActivity extends AppCompatActivity { 
> 
>  @Override 
>  protected void onCreate(Bundle savedInstanceState) { 
>   super.onCreate(savedInstanceState); 
>   setContentView(R.layout.activity_main); 
> 
>   //Appbar 
>   Toolbar toolbar = (Toolbar) findViewById(R.id.appbar); 
>   setSupportActionBar(toolbar); 
>   getSupportActionBar().setDisplayShowTitleEnabled(false); 
> 
>   //Appbar page filter 
>   Spinner cmbToolbar = (Spinner) findViewById(R.id.CmbToolbar); 
> 
>   ArrayAdapter<String> adapter = new ArrayAdapter<>(
>     getSupportActionBar().getThemedContext(), 
>     R.layout.appbar_filter_title, 
>     new String[]{"Opción 1 ", "Opción 2 ", "Opción 3 "}); 
> 
>   adapter.setDropDownViewResource(R.layout.appbar_filter_list); 
> 
>   cmbToolbar.setAdapter(adapter); 
> 
>   cmbToolbar.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
>    @Override 
>    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) { 
>     //... Acciones al seleccionar una opción de la lista 
>     Log.i("Toolbar 3", "Seleccionada opción " + position); 
> 
>     Fragment f = null; 
> 
>     switch(position) { 
>      case 0: 
>       f = Fragment2.newInstance(); 
>       break; 
> 
>      case 1: 
>       f = Fragment1.newInstance(); 
>       break; 
> 
>     } 
>    } 
> 
>    @Override 
>    public void onNothingSelected(AdapterView<?> adapterView) { 
>     //... Acciones al no existir ningún elemento seleccionado 
>    } 
>   }); 
>  } 
> 
>  @Override 
>  public boolean onCreateOptionsMenu(Menu menu) { 
>   // Inflate the menu; this adds items to the action bar if it is present. 
>   getMenuInflater().inflate(R.menu.menu_main, menu); 
>   return true; 
>  } 
> 
>  @Override 
>  public boolean onOptionsItemSelected(MenuItem item) { 
>   // Handle action bar item clicks here. The action bar will 
>   // automatically handle clicks on the Home/Up button, so long 
>   // as you specify a parent activity in AndroidManifest.xml. 
>   int position = item.getItemId(); 
> 
>   Fragment f = null; 
> 
>   switch(position) { 
>    case 0: 
>     f = Fragment2.newInstance(); 
>     break; 
> 
>    case 1: 
>     f = Fragment1.newInstance(); 
>     break; 
> 
>    case 2: 
>     Intent intent = new Intent(getApplicationContext(), Fragment1.class); 
>     startActivity(intent); 
>     break; 
> 
>   } 
>   return super.onOptionsItemSelected(item); 
>  } 
> 
> 
>  public Fragment getItem(int position) { 
> 
>   Fragment f = null; 
> 
>   switch(position) { 
>    case 0: 
>     f = Fragment2.newInstance(); 
>     break; 
> 
>    case 1: 
>     f = Fragment1.newInstance(); 
>     break; 
> 
>    case 2: 
>     Intent intent = new Intent(getApplicationContext(), Fragment1.class); 
>     startActivity(intent); 
>     break; 
> 
>   } 
> 
>   return f; 
>  } } 
Powiązane problemy