2011-11-09 7 views
3

Bonjour J'ai du mal à changer la vue visuelle de l'activité du fragment. J'ai créé tous les onglets mais onClick je ne sais pas comment passer l'activité dans cet espace blanc.Android comment interagir avec les onglets Fragment

http://i40.tinypic.com/22bwxx.png

de sorte que la structure de c'est une activité simple nommée Main qui définit simplement le point de vue du contenu d'un document maintabholder.xml qui détient la vue fragment qui se connecte à une classe nommée MainNav dont la vue le contenu contient tous les onglets le fond.

maintabholder.xml:

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
> 

<include layout="@layout/header" android:layout_alignParentTop="true"   android:id="@+id/headerArea"></include> 
<fragment 
    class="my.package.name.MainNav" 
    android:id="@+id/fragment_tabs" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 
</LinearLayout> 

MainNav.java code snippet:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
{ 
    mRoot = inflater.inflate(R.layout.fragment_tabs, null); 
    mTabHost = (TabHost) mRoot.findViewById(android.R.id.tabhost); 
    setupTabs(); 
    return mRoot; 
} 

et R.layout.fragment_tabs:

<?xml version="1.0" encoding="utf-8"?> 
<TabHost 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@android:id/tabhost" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="#EFEFEF"> 

<RelativeLayout 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <TabWidget 
     android:id="@android:id/tabs" 
     android:layout_alignParentBottom="true" 
     android:layout_width="fill_parent" 
     android:background="@drawable/tab_background" 
     android:gravity="center_horizontal" 
     android:layout_height="wrap_content" > 
    </TabWidget> 

     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="fill_parent" 

      android:layout_height="wrap_content"> 

      <FrameLayout 
       android:id="@+id/tab_1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 

      <FrameLayout 
       android:id="@+id/tab_2" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 
      <FrameLayout 
       android:id="@+id/tab_3" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 
       <FrameLayout 
       android:id="@+id/tab_4" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 
       <FrameLayout 
       android:id="@+id/tab_5" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 

     </FrameLayout> 
</RelativeLayout> 

Enfin Loung ents d'une activité que je veux charger dans le Fragment (sur appuyant sur le bouton tab1)

public class HomeFragment extends Activity { 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.home); 

    } 
} 

C'est de vous aider à comprendre l'essentiel des choses, mais le problème se produit ici MainNav.java:

@Override 
    public void onTabChanged(String tabId) { 
     Log.d(TAG, "onTabChanged(): tabId=" + tabId); 
     if (TAB_HOME.equals(tabId)) { 
      updateTab(tabId, R.id.tab_1); 
      mCurrentTab = 0; 
      return; 
     } 
    } 

lorsqu'un onglet est cliqué, il est enregistré dans l'activité onTabChanged et la fonction updateTab est appelée:

private void updateTab(String tabId, int placeholder) { 
     FragmentManager fm = getFragmentManager(); 
     if (fm.findFragmentByTag(tabId) == null) { 
      //fm.beginTransaction() 
      //  .replace(placeholder, /*need fragment object here*/ , tabId) 
      //  .commit(); 
      // 
     } 
} 

commenté l'replace méthode est à la recherche d'un (int, fragment, string) et je suppose que cela devrait alors changer l'espace blanc pour moi.

mais je ne comprends pas d'où provient l'objet fragment! Cet objet fantôme doit contenir en quelque sorte la disposition xml de ma HomeFragment et me permettre d'interagir avec tout ce que j'ai codé pour l'activité HomeFragment.

Mon premier sentiment est que mon HomeFragment activité doit extend FragmentActivity à la place juste activité. Mais c'est là que je frappe un mur.

Il y a très peu de documentation sur les méthodes de pack de compatibilité, mais la documentation de TabActivity dit de ne plus utiliser TabActivity, donc je suis là. Développement pour Android 2.2+

Insight apprécié.

Répondre

5

Vous ne pouvez pas mettre des activités dans des fragments, c'est simple comme bonjour. Vous devez convertir vos Activités qui servent le contenu de l'onglet en Fragments. Cela ne devrait pas poser de problème, étant donné que vous n'utilisez pas de fragments dans ces activités.

Voici donc 2 règles à suivre:

  1. Vous ne pouvez pas mettre Activités en fragments.
  2. Vous ne pouvez pas mettre des fragments dans des fragments.

Je vous recommande de conserver ce fragment inférieur sur votre disposition juste pour gérer les tabulations dans l'onglet-widget. Si un changement d'onglet se produit, vous le signalez à l'activité parente, qui chargera le fragment correspondant dans le champ au-dessus du fragment de tabulation. Pour que cela fonctionne, vous devez modifier votre mise en page afin qu'elle dispose d'un ViewGroup au-dessus du fragment de tabulation et en dessous de l'en-tête. Vous chargez dynamiquement les fragments avec le contenu de l'onglet dans ce ViewGroup.

est ici la mise en page (maintabholder.xml):

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
> 

<include layout="@layout/header" android:layout_alignParentTop="true"   android:id="@+id/headerArea"></include> 

<FrameLayout android:id="@+id/TabContent" 
    android:layout_width="fill_parent" 
    android:layout_height="0dip" 
    android:layout_weight="1"/> 

<fragment 
    class="my.package.name.MainNav" 
    android:id="@+id/fragment_tabs" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 
</LinearLayout> 

Lorsqu'un onglet commutateur se passe dans votre fragment inférieur, vous le dire à l'activité parent:

... 
(YourActivity)getActivity().switchToTab(tabId); 
... 

Et dans le YourActivity :

... 
public void switchToTab(int tabId){ 
    switch(tabId){ 
    ... 
    case 2: 
     getSupportFragmentManager().beginTransaction().replace(R.id.TabContent, TabContentFragment2.newInstance(), "someTag").commit(). 
    break; 
    ... 
    } 
} 

Quelque chose comme ça.

+0

c'était très utile! Une chose que j'ai est qu'une de mes activités contient une carte google. Il doit donc étendre MapActivity. Si je change cette activité en FragmentActivity alors il plante avec l'erreur évidente "mapview ne peut être appelé qu'à partir de MapActivity", ceci est un problème pour moi et cette structure de fragment à moins que je crée une sorte d'hybride MapFragmentActivity ..... – CQM

+0

cette lib https://github.com/petedoyle/android-support-v4-googlemaps. Je n'ai pas d'expérience avec ça, mais ça pourrait marcher. –

+3

@ ZsomborErdődy-Nagy - vous recommandez la bibliothèque de support, mais aussi que les fragments ne peuvent pas être dans des fragments, ce n'est plus vrai. La bibliothèque de support a eu quelques problèmes avec cela, mais depuis v11, publié autour de votre publication, il y a provisionnement pour les fragments imbriqués avec une logique légèrement spécifique pour le supporter (getChildFragmentManager). Donc, pour toute personne qui trouve ce fil, les activités peuvent ne pas être en fragments, mais les fragments peuvent maintenant être en fragments. – SandWyrm

Questions connexes