Aller au contenu

fragment + tabhost + activity


kingconv

Recommended Posts

J'ai un écran à onglet (géré par le tabhost) et j'utilise fragmentactivity et fragment (en remplacement de tabactivity).

Je souhaiterais lancer dans le fragment créé une activity (avec layout et gestion d'une base et de bouton).

Est-ce possible? Comment lancer une activity à partir d'une classe fragment?

J'arrive bien à "inflater" le layout attendu mais comment lancer l'activity lié au layout tout en gardant les onglets (tabhost)?

Merci pour votre aide

Le code de ma principale activité :

import java.util.HashMap;

import android.content.Context;

import android.content.Intent;

import android.os.Bundle;

import android.support.v4.app.Fragment;

import android.support.v4.app.FragmentActivity;

import android.support.v4.app.FragmentTransaction;

import android.view.View;

import android.widget.TabHost;

import android.widget.TabHost.TabSpec;

public class MonActivite extends FragmentActivity {

TabHost mTabHost;

private TabSpec tabSpec;

TabManager mTabManager;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

mTabHost = (TabHost)findViewById(android.R.id.tabhost);

mTabHost.setup();

mTabManager = new TabManager(this, mTabHost, R.id.realtabcontent);

mTabManager.addTab(mTabHost.newTabSpec("tab1").setIndicator("tab1"),

Tab1Fragment.class, null);

mTabManager.addTab(mTabHost.newTabSpec("tab2").setIndicator("tab2"), Tab2Fragment.class, null);

if (savedInstanceState != null) {

mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));

}

}

@Override

protected void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

outState.putString("tab", mTabHost.getCurrentTabTag());

}

/**

* This is a helper class that implements a generic mechanism for

* associating fragments with the tabs in a tab host. It relies on a

* trick. Normally a tab host has a simple API for supplying a View or

* Intent that each tab will show. This is not sufficient for switching

* between fragments. So instead we make the content part of the tab host

* 0dp high (it is not shown) and the TabManager supplies its own dummy

* view to show as the tab content. It listens to changes in tabs, and takes

* care of switch to the correct fragment shown in a separate content area

* whenever the selected tab changes.

*/

public static class TabManager implements TabHost.OnTabChangeListener {

private final FragmentActivity mActivity;

private final TabHost mTabHost;

private final int mContainerId;

private final HashMap<String, TabInfo> mTabs = new HashMap<String, TabInfo>();

TabInfo mLastTab;

static final class TabInfo {

private final String tag;

private final Class<?> clss;

private final Bundle args;

private Fragment fragment;

TabInfo(String _tag, Class<?> _class, Bundle _args) {

tag = _tag;

clss = _class;

args = _args;

}

}

static class DummyTabFactory implements TabHost.TabContentFactory {

private final Context mContext;

public DummyTabFactory(Context context) {

mContext = context;

}

public View createTabContent(String tag) {

View v = new View(mContext);

v.setMinimumWidth(0);

v.setMinimumHeight(0);

return v;

}

}

public TabManager(FragmentActivity activity, TabHost tabHost, int containerId) {

mActivity = activity;

mTabHost = tabHost;

mContainerId = containerId;

mTabHost.setOnTabChangedListener(this);

}

public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) {

tabSpec.setContent(new DummyTabFactory(mActivity));

String tag = tabSpec.getTag();

TabInfo info = new TabInfo(tag, clss, args);

// Check to see if we already have a fragment for this tab, probably

// from a previously saved state. If so, deactivate it, because our

// initial state is that a tab isn't shown.

info.fragment = mActivity.getSupportFragmentManager().findFragmentByTag(tag);

if (info.fragment != null && !info.fragment.isDetached()) {

FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();

ft.detach(info.fragment);

ft.commit();

}

//tabSpec.setContent(intent);

mTabs.put(tag, info);

mTabHost.addTab(tabSpec);

}

public void onTabChanged(String tabId) {

TabInfo newTab = mTabs.get(tabId);

if (mLastTab != newTab) {

FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();

if (mLastTab != null) {

if (mLastTab.fragment != null) {

ft.detach(mLastTab.fragment);

}

}

if (newTab != null) {

if (newTab.fragment == null) {

newTab.fragment = Fragment.instantiate(mActivity,newTab.clss.getName(), newTab.args);

ft.add(mContainerId, newTab.fragment, newTab.tag);

} else {

ft.attach(newTab.fragment);

}

}

mLastTab = newTab;

ft.commit();

mActivity.getSupportFragmentManager().executePendingTransactions();

}

}

}

}

Le code de mon fragment dans le quel je voudrais faire un intent d'une activity:

public class Tab1Fragment extends Fragment {

public void onAttach(Activity activity){

super.onAttach(activity);

}

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//Intent monIntent = new Intent(getActivity(),ActiviteSolde.class);

//startActivity(monIntent);

}

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

if (container == null) {

return null;

}

return (LinearLayout)inflater.inflate(R.layout.solde, container, false);

}

public void onActivityCreated(Bundle savedInstanceState) {

super.onActivityCreated(savedInstanceState);

}

}

Lien vers le commentaire
Partager sur d’autres sites

  • 1 month later...

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...