33 votes

Lancer des activités dans un onglet sous Android

Voici l'affaire. J'ai une application avec trois onglets. Par le biais de diverses interactions avec les éléments dans les onglets j'arrive à la fin de lancer d'autres activités. Le client a examiné et aimerions les activités lancées "dans" les pattes, de sorte que les onglets restent visibles et si l'utilisateur clique sur l'onglet, il remonte à l'origine de l'activité définie dans le setContent fonction. Est-ce possible et comment pourrais-je aller à ce sujet dans d'autres activités? (c'est à dire à l'enfant des activités, et non pas celui qui définit le TabHost et a accès à l'appel setContent)?

44voto

hcpl Points 5759

Il est possible de lancer des activités dans les onglets . Par conséquent, définissez le contenu tabspec sur un groupe d’activités au lieu d’une activité normale.

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

À partir de ce groupe d’activités, vous pouvez ensuite démarrer une autre activité comme celle-ci, qui ne met à jour que la vue du contenu de l’onglet dans lequel vous vous trouvez.

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

   }
}
 

11voto

Georgy Gobozov Points 4814

Voici ma solution

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

Onglet de lancement

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

Appelez l'activité suivante

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

Appelle à nouveau

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

Fonctionne sur l'émulateur 2.2

3voto

Premier Points 889

1voto

vous pouvez utiliser

 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 

pour chaque activité que vous définissez comme contenu pour tabSpec, cette activité sera créée chaque fois que vous appuierez sur l'onglet.

0voto

marcc Points 8513

commonsware.com est correcte, il n'est pas possible. J'ai eu un problème similaire, mais il n'était que de 1, qui a été lancé. J'ai sacrifié un peu de mon architecture et supprimé l'activité qui a été lancé à partir de l'intérieur de l'onglet. J'ai mis le code dans une Vue et puis j'ai ajouté un ViewAnimator à l'onglet activité. J'ai changé le bouton de retour et de supprimer ce point de vue, si c'est, ou encore le bouton de retour, effectuer normalement.

Cette truqué assez bien, et pour seulement 1, étroitement lié à l'activité, je ne vais pas perdre le sommeil au cours de la conception.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X