1

我知道,通常爲片段,你可以做自己的活動的onCreate這樣的檢索與方向的變化具有.setRetainInstance(真)已經創建的片段,而不是創建一個新片段:如何防止在定位更改時重新創建片段尋呼機中的片段?

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

    if (savedInstanceState == null) { 
     TestFragment test = new TestFragment(); 
     test.setArguments(getIntent().getExtras()); 
     getSupportFragmentManager().beginTransaction().replace(android.R.id.content, test, "your_fragment_tag").commit(); 
    } else { 
     TestFragment test = (TestFragment) getSupportFragmentManager().findFragmentByTag("your_fragment_tag"); 
    } 
} 

我問題是我如何保留和檢索viewpager中的這樣一個片段?重新創建片段不是我想要的。即使我可以檢索這些片段標籤viewpager句柄附加片段,所以它似乎不可能檢查現有的片段和檢索,而不是創建一個新的。這是我的活動和傳呼機:

public class MainActivity extends AppCompatActivity { 

    private ViewPager mViewPager; 

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

     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(new PagerAdapter(getSupportFragmentManager())); 


    } 

    public class PagerAdapter extends FragmentStatePagerAdapter { 
     public PagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch (position){ 
       case 0:      
        return new FragmentA(); 
       case 1: 
        return new SettingsFragment(); 
       default: 
        return null; 
      } 
     } 


     @Override 
     public int getCount() { 
      return 2; 
     } 
    } 


} 

回答

0

ViewPager自動標記的片段,所以尋找按標籤的片段沒有在一個不錯的選擇。但是,您可以通過重寫FragmentPagerAdapter類的instantiateItem(ViewGroup container, int position)方法來保留對查看傳呼機創建的片段的引用。

Fragment myFragment = null; 

    public class PagerAdapter extends FragmentStatePagerAdapter { 
     public PagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch (position){ 
       case 0:      
        return new FragmentA(); 
       case 1: 
        return new SettingsFragment(); 
       default: 
        return null; 
      } 
     } 


     @Override 
     public int getCount() { 
      return 2; 
     } 

     @Override 
     public Object instantiateItem(ViewGroup container, int position) { 
      myFragment = (Fragment) super.instantiateItem(container, position); 
      if (myFragment != null) { 
       Log.i(TAG, "Fragment retrieved " + myFragment.toString()); 
      } 

      return myFragment; 
     } 
    } 
相關問題