2013-05-23 3 views
5

Sto provando a creare tab layout with fragments. Quando aggiungo un altro frammento sull'elemento clic, dovrebbe mostrare un altro frammento sopra di esso. Non riesco a ottenere l'obiettivo. Il frammento va sopra quello esistente ma entrambi i frammenti sono visibili. Si prega di non gettare il link verso qualsiasi pagina di sviluppo per la spiegazione.Come aggiungere un altro frammento sul frammento esistente?

Ecco il mio codice

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> 

sto aggiungendo un altro frammento su list_item_click all'interno 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(); 
    } 

Ecco esimo e snapshot:

Screenshot

Tutte le idee/aiuto con la spiegazione sarebbe molto apprezzato.

Grazie !!

+0

* Sto cercando di creare layout di scheda con frammenti * - don 't. Frammenti come schede devono essere aggiunti in fase di runtime. – Luksprog

+0

@Luksprog quindi qual è il modo di farlo ?? Qualsiasi esempio plz – moDev

+0

@droid dev Ho implementato swipeTabs personalizzati + viewpager not sherlockActiionBar. Se vuoi puoi postare qui solution..it è facile da implementare. Ma il fatto è che non puoi aggiungere il frammento in modo dinamico. Quindi dipende da te. – TheFlash

risposta

7

Prima di tutto, penso che sia degno di nota ...

"Non è possibile sostituire un frammento definito staticamente nel file di layout. È possibile sostituire solo i frammenti che sono stati aggiunti dinamicamente tramite un FragmentTransaction"

vedere

Android: can't replace one fragment with another

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

Ecco la soluzione.

In home_activity.xml, è necessario lasciare vuoto il contenuto del tabcontent.

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

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

Nella tua onIemClick (Sports_Fragment), aggiungere questo

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

Il mio progetto completo, che si basa sul codice, è here.

Non ho avuto la possibilità di verificare realmente perché TabHost non funziona quando ho testato il codice. Ma FragmentTabHost funziona bene per me.

Modifica: Per risolvere il problema di sovrapposizione, è possibile impostare OnTabChangeListener:

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

    }); 

Circa il backpress, si può provare

ft.addToBackStack(null); 
+0

Sta funzionando, ma quando torno a un'altra scheda, si sovrappone semplicemente il frammento corrente su di essa. – moDev

+0

Se ho più frammenti su una scheda, come tornare al frammento precedente usando il backpress ?? – moDev

+0

Sono al lavoro ora. Ti risponderò quando ne avrò la possibilità. – pt2121