2014-06-17 105 views
0

我使用android支持库,我有3个片段的活动。 ,我有一个问题:替换片段的删除其他片段Android:替换片段删除其他片段

我的活动:

public class MainActivity extends FragmentActivity { 

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

     // Add 3 fragments: 

     if (savedInstanceState == null) { 

      getFragmentManager().beginTransaction() 
        .add(R.id.container1, new A(), A.class.getCanonicalName()) 
        .commit(); 
      getFragmentManager().beginTransaction() 
        .add(R.id.container2, new B(), B.class.getCanonicalName()) 
        .commit(); 
      getFragmentManager().beginTransaction() 
        .add(R.id.container3, new C(), C.class.getCanonicalName()) 
        .commit(); 
     } 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     int id = item.getItemId(); 
     if (id == R.id.test) { 

      Fragment fragment = getFragmentManager(). 
        findFragmentByTag(A.class.getCanonicalName()); 
      if (fragment == null) 
       fragment = new A(); 

      // Replace fragment A again 
       getFragmentManager() 
         .beginTransaction() 
         .replace(R.id.container1, fragment, fragment.getClass().getCanonicalName()) 
         .commit(); 
      // After this fragment B disappears 


      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

} 

我使用findFragmentByTag避免内存泄漏。 你能帮我吗?

+0

尝试增加这片段的交易,之前提交 '//添加本次交易后堆 .addToBackStack()' –

+0

不知道你的问题是清楚的,因为你做.replace这样按预期的方式取代了以往的片段。现在@IonutNegru说,如果问题是你不能倒退,那么使用addToBackStack,但问题并不清楚。 – HpTerm

+0

@HpTerm也是对的,你应该使用add来避免替换当前片段。我错过了那一个。 您可以查看碎片的官方文档。你的情况也有一些例子。 –

回答

0

试试这个方法:

做出共同马托在您的容器中添加片段,只是把这个代码,你的方法,并通过您的片段在mehod,如:

public void _LoadFragment(Fragment _frag){ 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.add(R.id.container, _frag); 
    fragmentTransaction.addToBackStack(null); 
    fragmentTransaction.commit(); 
} 
1
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 

// Replace whatever is in the fragment_container view with this fragment, 
// and add the transaction to the back stack so the user can navigate back 
transaction.replace(R.id.fragment_container, newFragment); 
transaction.addToBackStack(null); 

// Commit the transaction 
transaction.commit(); 

试试这个代码来替换任何片段

0
public class MainActivity extends FragmentActivity { 

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

     // Add 3 fragments: 

     if (savedInstanceState == null) { 

      getFragmentManager().beginTransaction() 
        .add(R.id.container1, new A(), A.class.getCanonicalName()) 
        .commit(); 
      getFragmentManager().beginTransaction() 
        .add(R.id.container2, new B(), B.class.getCanonicalName()) 
        .commit(); 
      getFragmentManager().beginTransaction() 
        .add(R.id.container3, new C(), C.class.getCanonicalName()) 
        .commit(); 
     } 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     int id = item.getItemId(); 
     if (id == R.id.test) { 

      Fragment fragment = getFragmentManager(). 
        findFragmentByTag(A.class.getCanonicalName()); 
      if (fragment == null) 
       fragment = new A(); 

      // Replace fragment A again 

      // After this fragment B disappears 
FragmentManager fm = getFragmentManager(); 
      FragmentTransaction fragmentTransaction = fm.beginTransaction(); 
      fragmentTransaction.replace(R.id.container1, fragment); 
fragmentTransaction.addToBackStack(null); 
      fragmentTransaction.commit(); 

      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

} 

试试这个