SORU
11 EKİM 2011, Salı


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
3 ŞUBAT 2012, Cuma


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!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ABC News (Australia)

    ABC News (Au

    9 HAZİRAN 2008
  • erikbjgn's channel

    erikbjgn's c

    12 Mayıs 2008
  • Xcode programming tutorials

    Xcode progra

    17 EYLÜL 2006