2017-01-23 83 views
1

我有三個Fragments。在每個按鈕上單擊,它將加載相應的Fragment。如果我再次嘗試點擊按鈕,它將重新創建一個新的Fragment並加載,但不是創建一個新的Fragment我需要顯示現有的後備棧Fragment片段後備棧android

代碼:

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 
    private Frag1 frag1; 
    private Frag2 frag2; 
    private Frag3 frag3; 
    Button one,two,three; 
    FragmentTransaction fragmentTransaction; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     registerViewComponent(); 
     registerClick(); 


    } 

    private void registerClick() { 
     one.setOnClickListener(this); 
     two.setOnClickListener(this); 
     three.setOnClickListener(this); 
    } 

    private void registerViewComponent() { 
     one=(Button)findViewById(R.id.one); 
     two=(Button)findViewById(R.id.two); 
     three=(Button)findViewById(R.id.three); 
    } 

    @Override 
    public void onClick(View view) { 

     switch (view.getId()) 
     { 
      case R.id.one: 
       frag1=new Frag1(); 
       frag3=new Frag3(); 
       frag2=new Frag2(); 

       fragmentTransaction=getSupportFragmentManager().beginTransaction(); 


       Fragment fragment2 =  getSupportFragmentManager().findFragmentByTag("Frag1"); 
       Log.v("Tag","Tagg::"+fragment2); 
       if (fragment2 instanceof Frag1){ 
        Log.v("If","IF::"+fragment2); 
       } 
       else { 


        fragmentTransaction.add(R.id.stack_frame,frag1,"Frag1").addToBackStack("Frag1"); 
        fragmentTransaction.commit(); 
       } 

       break; 
      case R.id.two: 
     frag2=new Frag2(); 

       Fragment fragment = getSupportFragmentManager().findFragmentByTag("Frag2"); 
       Log.v("Tag","Tagg::"+fragment); 
       if (fragment instanceof Frag2){ 
        Log.v("If","IF::"+fragment); 


       } 
       else { 

        fragmentTransaction=getSupportFragmentManager().beginTransaction(); 
        fragmentTransaction.add(R.id.stack_frame,frag2,"Frag2").addToBackStack("Frag2"); 
        fragmentTransaction.commit(); 
       } 
       break; 
      case R.id.three: 
       frag3=new Frag3(); 
       Fragment fragment1 = getSupportFragmentManager().findFragmentByTag("Frag3"); 
       Log.v("Tag","Tagg::"+fragment1); 
       if (fragment1 instanceof Frag3){ 
        Log.v("If","IF::"+fragment1); 


       } 
       else { 

        fragmentTransaction=getSupportFragmentManager().beginTransaction(); 
        fragmentTransaction.add(R.id.stack_frame,frag3,"Frag3").addToBackStack("Frag3"); 

        fragmentTransaction.commit(); 

       } 

       break; 
     } 

    } 

enter image description here

+1

不要在按鈕單擊時創建新對象,檢查片段是否有值 –

+0

它包含值,如何在不創建時再次顯示該片段? –

回答

0
Frag3 frag3;  
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.frame_main); 
    if (fragment instanceof Frag3) { 
    frag3 = (Frag3) fragment; 
    } else { 
    frag3 = new Frag3(); 
    } 

-------------- -------------- OR -------

Frag3 frag3 = new Frag3(); 
List<Fragment> fragments = getSupportFragmentManager().getFragments(); 
for(Fragment fragment : fragments){ 
    if(fragment instanceof Frag3){ 
    frag3 = (Frag3)fragment; 
    } 
} 

然後做片段交易

fragmentTransaction=getSupportFragmentManager().beginTransaction(); 
fragmentTransaction.add(R.id.stack_frame,frag3,"Frag3").addToBackStack("Frag3"); 
fragmentTransaction.commit(); 
+0

它沒有顯示堆棧片段onclick() –

+0

如果我再次點擊按鈕1,它應該顯示片段而不再創建 –

+0

創建片段的第一個新實例,然後它將檢查退回堆棧,如果它們已經是片段的實例存在,如果它存在,那麼它將用舊實例替換新實例並返回舊的實例,如果它不存在,它將返回新實例 – user6380431