Bir ViewPager içinde yerini Parça
Bir ViewPager bu FragmentPagerAdapter kullanarak Parça kullanmaya çalışıyorum. İçin elde etmek için arıyorum ne bir parçası, ViewPager ilk sayfasında yer alan başka bir tane ile değiştir.
Çağrı cihazı iki sayfadan oluşmaktadır. Birincisi FirstPagerFragment, ikinci bir SecondPagerFragment. İlk sayfada bir butonu. Bu NextFragment ile FirstPagerFragment değiştirmek istiyorum.
Aşağıda benim kod var.
public class FragmentPagerActivity extends FragmentActivity {
static final int NUM_ITEMS = 2;
MyAdapter mAdapter;
ViewPager mPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_pager);
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
}
/**
* Pager Adapter
*/
public static class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
if(position == 0) {
return FirstPageFragment.newInstance();
} else {
return SecondPageFragment.newInstance();
}
}
}
/**
* Second Page FRAGMENT
*/
public static class SecondPageFragment extends Fragment {
public static SecondPageFragment newInstance() {
SecondPageFragment f = new SecondPageFragment();
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Log.d("DEBUG", "onCreateView");
return inflater.inflate(R.layout.second, container, false);
}
}
/**
* FIRST PAGE FRAGMENT
*/
public static class FirstPageFragment extends Fragment {
Button button;
public static FirstPageFragment newInstance() {
FirstPageFragment f = new FirstPageFragment();
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Log.d("DEBUG", "onCreateView");
View root = inflater.inflate(R.layout.first, container, false);
button = (Button) root.findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction trans = getFragmentManager().beginTransaction();
trans.replace(R.id.first_fragment_root_id, NextFragment.newInstance());
trans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
trans.addToBackStack(null);
trans.commit();
}
});
return root;
}
/**
* Next Page FRAGMENT in the First Page
*/
public static class NextFragment extends Fragment {
public static NextFragment newInstance() {
NextFragment f = new NextFragment();
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Log.d("DEBUG", "onCreateView");
return inflater.inflate(R.layout.next, container, false);
}
}
}
...ve burada xml dosyaları
fragment_pager.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:padding="4dip"
android:gravity="center_horizontal"
android:layout_width="match_parent" android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@ id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
</android.support.v4.view.ViewPager>
</LinearLayout>
first.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@ id/first_fragment_root_id"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button android:id="@ id/button"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="to next"/>
</LinearLayout>
Şimdi sorun... hangi KİMLİĞİ kullanmalıyım
trans.replace(R.id.first_fragment_root_id, NextFragment.newInstance());
?
Eğer R. kimliği kullanıyorum.first_fragment_root_id, yerine çalışır, ama Hiyerarşi Görüntüleyici aşağıdaki gibi garip bir davranış gösterir.
Bu durum başlangıçta
durum değişiminden sonra
Yanlış bir şey mi var gördüğünüz gibi, aynı devletin parçası değiştiririm sonra ilk resimde görüldüğü gibi bulmak istiyorum.
CEVAP
Kaynak ViewPager
FragmentStatePagerAdapter
kod değiştirme ihtiyacı olan başka bir çözümü var ve yazar tarafından kullanılan FragmentPagerAdapter
temel sınıf ile çalışır.
Başlamak için kullansın hangi yazarın soru cevaplamak istiyorum; kaptan, yani görünümün çağrı KİMLİĞİ kendi KİMLİĞİ. Muhtemelen kendiniz de fark ettiği gibi, ancak kodunuzda bu KİMLİĞİ kullanarak bir şey olmasına neden olur. Neden açıklayayım:
Öncelikle ViewPager
sayfaları yeniden yapmak için, adaptörün temel sınıfta bulunan notifyDataSetChanged()
aramalısın.
İkinci olarak, ViewPager
imha edilmesi gereken ve bulundurulması gereken kontrol getItemPosition()
soyut yöntemi kullanır. Bu işlev varsayılan uygulama her zaman ViewPager
tüm geçerli sayfa ve yeni sayfa ekleme değil sonuç olarak tutmak için nedenleri POSITION_UNCHANGED
döndürür. Böylece, yedek parça iş yapmak için, getItemPosition()
adaptör geçersiz olması gerekir ve bir eski, gizli aradığında POSITION_NONE
, parçası olarak bağımsız dönmelidir.
Bu da adaptör her zaman bu görevi, FirstPageFragment
0 veya NextFragment
görüntülenen farkında olması gerektiğini anlamına gelir. Bunu yapmanın bir yolu, parçalara geçiş yapmak için zamanı geldiğinde çağrılacak FirstPageFragment
, oluştururken bir dinleyici sağlıyor. Bu olsa, parça adaptörü tüm parça ve anahtarları ViewPager
FragmentManager
çağrıları işlemek için iyi bir şey olduğunu düşünüyorum.
Üçüncü olarak, FragmentPagerAdapter
önbelleğe parçaları tarafından kullanılan bir isim olan türemiş pozisyon, öyle olsaydı bir parçası konumunda 0, olmayacak yerine olsa bile sınıftır. İki çözüm var, ama en basit etiketi kaldırır FragmentTransaction
remove()
işlevini kullanmaktır.
Ne çok yazı var, burada senin durumunda işe gereken kod:
public class MyAdapter extends FragmentPagerAdapter
{
static final int NUM_ITEMS = 2;
private final FragmentManager mFragmentManager;
private Fragment mFragmentAtPos0;
public MyAdapter(FragmentManager fm)
{
super(fm);
mFragmentManager = fm;
}
@Override
public Fragment getItem(int position)
{
if (position == 0)
{
if (mFragmentAtPos0 == null)
{
mFragmentAtPos0 = FirstPageFragment.newInstance(new FirstPageFragmentListener()
{
public void onSwitchToNextFragment()
{
mFragmentManager.beginTransaction().remove(mFragmentAtPos0).commit();
mFragmentAtPos0 = NextFragment.newInstance();
notifyDataSetChanged();
}
});
}
return mFragmentAtPos0;
}
else
return SecondPageFragment.newInstance();
}
@Override
public int getCount()
{
return NUM_ITEMS;
}
@Override
public int getItemPosition(Object object)
{
if (object instanceof FirstPageFragment && mFragmentAtPos0 instanceof NextFragment)
return POSITION_NONE;
return POSITION_UNCHANGED;
}
}
public interface FirstPageFragmentListener
{
void onSwitchToNextFragment();
}
Bu kimse yardımcı olur umarım!
Bir parça içinde parça viewpager ekran...
Nasıl ViewPager içinde parmak ile kayd...
Android ViewPager Parça Sayfa çıkarın...
Etkinlik grup içinde başka bir parça y...
Nasıl Parça ViewPager görünür olduğund...