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
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);
}
}
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.
Rozwiązałem z tym: Experience - Multiple Android Activities in a TabActivity
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
Pamiętaj, że "ActivityGroup" jest teraz przestarzałe. – CommonsWare
Ten kod działa zgodnie z oczekiwaniami. –
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. –
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
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
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;
> } }
- 1. Zapisywanie rozpoczętych działań w Androidzie
- 2. ShareActionProvider bez paska działań w Androidzie
- 3. Webview w Androidzie wisi tylko w zakładce Samsung galaxy 2
- 4. Uruchamianie JavaScript w ramach usługi w Androidzie
- 5. Wykonywanie działań w tle
- 6. Uruchamianie Node.Js na Androidzie
- 7. Uruchamianie ffmpeg jako biblioteki w Androidzie
- 8. JQuery onchange w zakładce event
- 9. Otwieranie linku w nowej zakładce
- 10. Uruchamianie aplikacji z pokryciem kodu w Androidzie Studio
- 11. getContentView w Androidzie
- 12. Zastępowanie domyślnego paska działań kontekstowych dla zaznaczania tekstu (w WebView) w Androidzie
- 13. wifi zmieniło działań w android
- 14. Przechowywanie działań użytkownika w Django
- 15. Android Fragment wyświetlanie stanu w przyjmującym zakładce
- 16. Jak ustawić aktywną kartę w zakładce PrimElementsView?
- 17. Otwarty router React Link w nowej zakładce
- 18. Pokaż stronę internetową w zakładce jonowej
- 19. Przycisk Zamknij na każdej zakładce w Tabpanelu
- 20. Przewijanie myszy zawiesza się w zakładce chrome
- 21. Jak otworzyć popup.html linki w zakładce?
- 22. Wysyłanie dalszych działań podczas obsługi działań
- 23. Jak wyczyścić Android Stack działań?
- 24. stos działań
- 25. Dodawanie przycisków do paska działań Android
- 26. Otwieranie (c) znaczników w nowej zakładce w (G) Vim
- 27. Otwórz aplikację w określonej zakładce w pasku zakładek
- 28. Ponowne mapowanie: pomoc w Vimie otwierania w nowej zakładce
- 29. Jak wyeliminować miejsca w zakładce kolumny w SQL Server 2008
- 30. Lista wszystkich dostępnych działań w google home
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
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
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ę .. –