2013-07-02 35 views
5

Ich weiß, es gibt verschiedene Frage auf SO bezogen auf die Frage, aber keiner von ihnen bietet Lösung für mich. Ich habe 4 Registerkarten in fragment activity und jede Registerkarte hat eine eigene fragment. Ich gehe in eine andere fragment hinein. Wenn ich auf Tabs umschalte wird es manchmal überlappend und beide sind sichtbar. HierFragment überlagert auf einem anderen Fragment

ist der Code (xml):

<Button 
    android:id="@+id/checkBal" 
    android:layout_width="fill_parent" 
    android:layout_height="45dp" 
    android:clickable="false" 
    android:gravity="left|center_vertical" 
    android:typeface="serif" /> 

<View 
    android:layout_width="fill_parent" 
    android:layout_height="2dp" 
    android:layout_marginLeft="5dp" 
    android:layout_marginRight="5dp" 
    android:layout_marginTop="2dp" 
    android:background="@color/green" /> 

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

<android.support.v4.app.FragmentTabHost 
    android:id="@android:id/tabhost" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 

    <FrameLayout 
     android:id="@android:id/tabcontent" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_weight="0" /> 
</android.support.v4.app.FragmentTabHost> 

public class Tab_Activity extends FragmentActivity { 

FragmentTabHost mHost; 
Button balance; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.tabs); 

    balance = (Button) findViewById(R.id.checkBal); 
    mHost = (FragmentTabHost) findViewById(android.R.id.tabhost); 
    mHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); 

    mHost.addTab(mHost.newTabSpec("Home").setIndicator("Home"), 
      Home_Fragment.class, null); 
    mHost.addTab(mHost.newTabSpec("Number").setIndicator("Send to number"), 
      Number_Fragment.class, null); 
    mHost.addTab(
      mHost.newTabSpec("Contact").setIndicator("Send to contacts"), 
      Contact_Fragment.class, null); 
    mHost.addTab(mHost.newTabSpec("Group").setIndicator("Send to groups"), 
      Group_Fragment.class, null); 

    mHost.setOnTabChangedListener(new OnTabChangeListener() { 

     @Override 
     public void onTabChanged(String tabId) { 
      // TODO Auto-generated method stub 

      if (tabId.equalsIgnoreCase("Home")) { 

       Home_Fragment home = new Home_Fragment(); 

       FragmentManager manager = getSupportFragmentManager(); 
       FragmentTransaction ft = manager.beginTransaction(); 
       ft.replace(R.id.realtabcontent, home, "Home"); 
       ft.commit(); 

      } 

      if (tabId.equalsIgnoreCase("Number")) { 

       Number_Fragment number = new Number_Fragment(); 

       FragmentManager manager = getSupportFragmentManager(); 
       FragmentTransaction ft = manager.beginTransaction(); 
       ft.replace(R.id.realtabcontent, number, "Number"); 
       ft.commit(); 

      } 
      if (tabId.equalsIgnoreCase("Contact")) { 

       Contact_Fragment contact = new Contact_Fragment(); 

       FragmentManager manager = getSupportFragmentManager(); 
       FragmentTransaction ft = manager.beginTransaction(); 
       ft.replace(R.id.realtabcontent, contact, "Contact"); 
       ft.commit(); 
      } 

      if (tabId.equalsIgnoreCase("Group")) { 

       Group_Fragment group = new Group_Fragment(); 

       FragmentManager manager = getSupportFragmentManager(); 
       FragmentTransaction ft = manager.beginTransaction(); 

       ft.replace(R.id.realtabcontent, group, "Group"); 
       ft.commit(); 
      } 

     } 
    }); 

} 




public void newFragment(Fragment fragment, String tag) { 

    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction ft = manager.beginTransaction(); 
    // 
    if (tag.equalsIgnoreCase("Group")) 
     ft.remove(new Group_Fragment()); 
    else 
     ft.remove(new Contact_Fragment()); 
    ft.replace(R.id.realtabcontent, fragment); 
    ft.addToBackStack(null); 
    ft.commit(); 

} 

public void updateContacts(ArrayList<String> cList) { 

    FragmentManager manager = getSupportFragmentManager(); 

    Contact_Fragment contactFrag = (Contact_Fragment) manager 
      .findFragmentByTag("Contact"); 
    contactFrag.updateData(cList); 

} 

} 

Aufruf Fragment innerhalb neue Fragment

mActivity.newFragment(new Select_Group_Fragment(), "Group"); 

Als i c bin Alling Fragment aus einem anderen Fragment benötigen i addToBackStack in new fragment Methode in Tab_Activity

Overlapped screenshot

Bitte helfen Jungs

+0

Ein Bild zu entfernen, könnte nützlich sein, die Überlappung – dymmeh

+0

Überlappung gibt durch das Layout verursacht werden, werden zu zeigen. Wenn Sie "RelativeLayout" verwenden, ohne die Reihenfolge anzugeben, in der die Ansichten angezeigt werden, oder "FrameLayout", kann dieses unvorhersehbare Verhalten auftreten. –

+0

@dymeh Screenshot angefügt – moDev

Antwort

0

Von allem, was hinzufügen, dass ich auf Fragmente gesehen habe, also Google IO, Stackoverflow, etc ., das ist nicht der Weg, damit umzugehen. Die Aktivität sollte steuern, welches Fragment aktiv ist. Das Fragment sollte auf die Aktivität zur Fragmentkontrolle verschoben werden. Möglicherweise müssen Sie Daten zwischen den Fragmenten an die Aktivität übergeben. Google-Entwickler raten dringend davon ab, die Kommunikation zwischen Fragmenten zu fragmentieren. Fragmente sollen eine Teilmenge eines Bildschirms sein.

Ihr Overlay sieht so aus, als hätten Sie 2 Fragmente gleichzeitig aktiv.

FYI. Es empfiehlt sich, Fragmenttransaktionen zu verwenden, um mehrere Fragmente innerhalb einer Aktivität zu bearbeiten. Das Starten einer Aktivität, die ein Fragment aus XML initiiert, kann von Fragmenttransaktionen nicht wirklich manipuliert werden.

Hoffe, das hilft.

0

Im AndroidMainifest.xml Änderung:

android:name=".activities.youactivityname" 
android:configChanges="screenSize|orientation" 
0
layout.removeAllViews(); 

verwenden diese vorherige Ansicht

Verwandte Themen