2014-09-30 88 views
0

我想从后面的堆栈中重用片段,即隐藏并显示它是否存在于后台堆栈中。这里是我的代码:隐藏并显示片段,片段视图不可见

活动:`

public class MyActivity extends Activity implements View.OnClickListener{ 


Button b1; 
Button b2; 
Button b3; 
Button b4; 
FrameLayout frameLayout; 
FrameLayout frameLayout2; 
BlankFragment fragment; 


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

    b1=(Button)findViewById(R.id.button1); 
    b2=(Button)findViewById(R.id.button2); 
    b3=(Button)findViewById(R.id.button3); 

    b1.setOnClickListener(this); 
    b2.setOnClickListener(this); 
    b3.setOnClickListener(this); 
    frameLayout =(FrameLayout)findViewById(R.id.frame1); 
    frameLayout2 =(FrameLayout)findViewById(R.id.frame2); 

    getFragmentManager().addOnBackStackChangedListener(listener); 

} 



@Override 
public void onClick(View v) { 
    switch (v.getId()){ 
     case R.id.button1:{ 
      manageFragment(1); 
      break; 
     } 
     case R.id.button2:{ 
      manageFragment(2); 
      break; 
     } 
     case R.id.button3:{ 
      manageFragment(3); 
      break; 
     } 

    } 
} 

private void manageFragment(int i) { 

    FragmentManager manager = getFragmentManager(); 

    FragmentTransaction transaction = manager.beginTransaction(); 

    BlankFragment blankFragment = (BlankFragment)manager.findFragmentByTag(""+i); 

    if(blankFragment !=null){ 
     Log.v("123456","found the fragment in stack"); 
     transaction.hide(fragment); 
     transaction.show(blankFragment); 
     transaction.commitAllowingStateLoss(); 

      //if(i!=1){ 
       //frameLayout2.setVisibility(View.GONE); 
       //frameLayout.setVisibility(View.VISIBLE); 
       //frameLayout.bringToFront(); 
      //}else { 
       //frameLayout2.setVisibility(View.VISIBLE); 
       //frameLayout.setVisibility(View.GONE); 
       //frameLayout2.bringToFront(); 
     } 

     fragment =blankFragment; 

     return; 
    } 
      fragment = BlankFragment.newInstance("", "" + i); 

    //  if(i!=1){ 
//   transaction.replace(R.id.frame1,fragment,""+i); 
//   frameLayout2.setVisibility(View.GONE); 
//   frameLayout.setVisibility(View.VISIBLE); 
//   frameLayout.bringToFront(); 
//  }else{ 
//   transaction.replace(R.id.frame2,fragment,""+i); 
//   frameLayout2.setVisibility(View.VISIBLE); 
//   frameLayout.setVisibility(View.GONE); 
//   frameLayout2.bringToFront(); 
//  } 
    transaction.replace(android.R.id.content,fragment,""+i); 
    transaction.setTransition(FragmentTransaction.TRANSIT_NONE); 
    transaction.addToBackStack(""+i); 
    transaction.commitAllowingStateLoss(); 

} 

FragmentManager.OnBackStackChangedListener listener = new FragmentManager.OnBackStackChangedListener() { 
    @Override 
    public void onBackStackChanged() { 
     int i =getFragmentManager().getBackStackEntryCount(); 
     Log.v("123456","backstag count : "+i); 
    } 
}; 
} 
` 

//为注释代码的解释。 由于我有两个容器,我可以隐藏和显示(检索)只有2个fragments.As我的第三个碎片容器被重用,它的视图不显示。

所以我尝试使用android容器,并且根本不能显示来自雄鹿的片段。

如何从堆栈中检索所有的片段(这里是计数3,可能是N个片段),我想隐藏并显示片段不弹出。

+0

为什么不使用'transaction.replace'? – 2014-09-30 05:17:03

+0

它将分离并重新附加。视图将再次加载,我不想再次加载它 – Meher 2014-09-30 05:17:52

回答

0

基本上,您需要了解片段事务的工作原理。

片段backstack实际上是保持你在交易中所做的。这是为了便于后面的新闻事件。防爆。你有碎片A,B和C.现在

tx.replace(containerId, A); 
tx.addToBackStack(null); 
tx.replace(containerId, B); 
tx.addToBackStack(null); 
tx.replace(containerId, C); 
tx.addToBackStack(null); 

,我们将看到C在屏幕上
首届backpress你会看到画面B片段。 (C被删除)
第二次后退你会看到A.(B被删除)
第三次后退你会看到空白屏幕。 (A被删除)
这是堆栈的行为。

所以,我认为你不需要后台。你想要的只是
- 隐藏当前片段
- 如果不存在添加新片段。 (不要使用替换)
- 如果它存在给定的标签片段,则显示它。