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)?
Réponses
Trop de publicités?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);
}
}
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
J'ai résolu avec ceci: Expérience - Plusieurs activités Android dans un TabActivity
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.