2013-05-23 16 views
5

Ich versuche tab layout with fragments zu erstellen. Wenn ich ein weiteres Fragment zum Objekt hinzufüge, sollte es ein weiteres Fragment darüber anzeigen. Ich kann das Ziel nicht erreichen. Das Fragment geht einfach über das bestehende hinaus, aber beide Fragmente sind sichtbar. Bitte werfen Sie den Link zu keiner Entwickler-Seite zur Erklärung.Wie füge ich ein weiteres Fragment zum bestehenden Fragment hinzu?

Hier ist mein Code

home_activity.xml

<TabHost 
    android:id="@android:id/tabhost" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_alignParentBottom="true" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 

     <TabWidget 
      android:id="@android:id/tabs" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" > 
     </TabWidget> 

     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" > 

      <fragment 
       android:id="@+id/tab1" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       class="com.example.tabsfragment.School_Fragment" > 
      </fragment> 

      <fragment 
       android:id="@+id/tab2" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       class="com.example.tabsfragment.Sports_Fragment" > 
      </fragment> 
     </FrameLayout> 
    </LinearLayout> 
</TabHost> 

Home_Activity.java

public class Home_Activity extends FragmentActivity { 

TabHost mHost; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.home_activity); 

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

    mHost.setup(); 

    TabSpec schoolSpec = mHost.newTabSpec("School").setIndicator("School") 
      .setContent(R.id.tab1); 
    mHost.addTab(schoolSpec); 

    TabSpec sportSpec = mHost.newTabSpec("Sports").setIndicator("Sportss") 
      .setContent(R.id.tab2); 
    mHost.addTab(sportSpec); 

    mHost.setCurrentTab(1); 

} 

entertainment.xml

<FrameLayout 
    android:id="@+id/frameContainer" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" /> 
</FrameLayout> 

ich ein weiteres Fragment auf list_item_click innerhalb Sports_Fragment

@Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     // TODO Auto-generated method stub 

     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     Entertainment_Fragment enFragment = new Entertainment_Fragment(); 
     ft.replace(android.R.id.tabcontent, enFragment); 
     ft.commit(); 
    } 

Hier bin Zugabe ist th e-Snapshot:

Screenshot

Irgendwelche Ideen/mit Erklärung helfen würde sehr geschätzt.

Danke !!

+0

* I Tab Layout mit Fragmenten versuchen können, versuchen * zu schaffen - don t. Fragmente als Tabs sollen zur Laufzeit hinzugefügt werden. – Luksprog

+0

@Luksprog also, was ist der Weg, es zu tun? Jedes Beispiel plz – moDev

+0

@droid dev Ich habe benutzerdefinierte swipeTabs + viewpager nicht sherlockActiionBar implementiert. Wenn Sie wollen, dann kann ich hier Lösung schreiben .. es ist einfach zu implementieren.aber die Sache ist, dass Sie nicht dynamisch Fragment hinzufügen können. So liegt es an Ihnen. – TheFlash

Antwort

7

Zunächst einmal denke ich, dass es wert ist zu erwähnen ...

„Man kann nicht ein Fragment definierte statisch in der Layout-Datei ersetzen kann. Sie nur Fragmente ersetzen können, die Sie dynamisch über eine FragmentTransaction hinzugefügt“

Bitte sehen

Android: can't replace one fragment with another

How can I show a new Fragment within a single tab?

Hier ist die Lösung.

In home_activity.xml sollten Sie Ihren Tabcontent leer lassen.

<FrameLayout 
     android:id="@+id/tabcontent" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" /> 

Ihre Home_Activity

private FragmentTabHost mHost; 

public void changeFragment() { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    EntertainmentFragment enFragment = new EntertainmentFragment(); 
    ft.replace(R.id.tabcontent, enFragment); 
    ft.commit(); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mHost = (FragmentTabHost) findViewById(android.R.id.tabhost); 
    mHost.setup(this, getSupportFragmentManager(), R.id.tabcontent); 
    mHost.addTab(mHost.newTabSpec("School") 
      .setIndicator("School"), SchoolFragment.class, null); 
    mHost.addTab(mHost.newTabSpec("Sport") 
      .setIndicator("Sport"), SportsFragment.class, null); 
} 

In Ihrem onIemClick (Sports_Fragment), fügen Sie dieses

MainActivity mainAct = (MainActivity)getActivity(); 
      mainAct.changeFragment(); 

Mein volles Projekt, das auf dem Code basiert, ist here.

Ich hatte keine Chance zu überprüfen, warum TabHost nicht funktioniert, wenn ich Ihren Code getestet habe. Aber FragmentTabHost funktioniert gut für mich.

Edit: die Überlappung Problem zu beheben, können Sie OnTabChangeListener gesetzt:

mHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() { 

     @Override 
     public void onTabChanged(String tabId) { 
      // TODO Auto-generated method stub 
      if (tabId.equalsIgnoreCase("School")) { 
       Log.v(TAG, "school"); 
       FragmentTransaction ft = getSupportFragmentManager() 
         .beginTransaction(); 
       schoolFrag = new SchoolFragment(); 
       ft.replace(R.id.tabcontent, schoolFrag); 
       ft.commit(); 
      } 
      if (tabId.equalsIgnoreCase("Sport")) { 
       Log.v(TAG, "Sport"); 
       FragmentTransaction ft = getSupportFragmentManager() 
         .beginTransaction(); 
       SportsFragment sportFrag = new SportsFragment(); 
       ft.replace(R.id.tabcontent, sportFrag); 
       ft.commit(); 
      } 
     } 

    }); 

über den backpress Sie

ft.addToBackStack(null); 
+0

Es funktioniert, aber wenn ich zu einer anderen Registerkarte zurückwechsle, überlappt es einfach das aktuelle Fragment. – moDev

+0

Wenn ich mehrere Fragmente auf einer Registerkarte habe, dann, wie man mit Backpress ?? – moDev

+0

Ich bin jetzt bei der Arbeit. Ich melde mich bei Ihnen, wenn ich eine Chance habe. – pt2121

Verwandte Themen