Farklı Parçalar / Düzenlerle ViewPager nasıl uygulanır?


191

Viewpager'ı uygulayan bir etkinliğe başladığımda, viewpager çeşitli parçalar oluşturdu. Her parça için farklı düzenler kullanmak istiyorum, ama sorun viewpager max (1 sonra kalan tüm parçaları üzerinde ikinci düzen) yalnızca iki düzen gösterir.

Viewpager'ı uygulayan SwipeActivity kodu :

public class SwipeActivity extends FragmentActivity
{

    MyPageAdapter pageAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_swipe);
        pageAdapter = new MyPageAdapter(getSupportFragmentManager());
        ViewPager pager=(ViewPager)findViewById(R.id.pager);
        pager.setAdapter(pageAdapter);
        ActionBar bar = getActionBar();
        bar.setDisplayHomeAsUpEnabled(true);
    }
    /**
    * Custom Page adapter
    */
    private class MyPageAdapter extends FragmentPagerAdapter
    {
        public MyPageAdapter(FragmentManager fm)
        {
            super(fm);
        }
        @Override
        public int getCount()
        {
            return 5;
        }
        @Override
        public Fragment getItem(int position)
        {
            switch(position)
            {
                case 0: return new MyFragment();
                case 1: return SecondFragment.newInstance("asdasd");
                default : return RamFragment.newInstance("s");
            }
        }
     }
}

İşte parçaların kodu

public class MyFragment extends Fragment
{
   @Override
   public View onCreateView(LayoutInflater paramLayoutInflater, ViewGroup paramViewGroup,    Bundle paramBundle)
   {
     return paramLayoutInflater.inflate(R.layout.processorlayout, paramViewGroup, false);
   }
}

Bunun gibi 5 parça kullandım, hepsi farklı düzenlere sahipti, ancak viewpager maks.

EDIT : SecondFragment kodu

public class SecondFragment extends Fragment
{
   public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE";

  public static final SecondFragment newInstance(String paramString)
  {
    SecondFragment f = new SecondFragment();
    Bundle localBundle = new Bundle(1);
    localBundle.putString("EXTRA_MESSAGE", paramString);
    f.setArguments(localBundle);
    return f;
  }

  @Override
  public View onCreateView(LayoutInflater paramLayoutInflater, ViewGroup paramViewGroup, Bundle paramBundle)
  {
     return paramLayoutInflater.inflate(R.layout.motherboardlayout, paramViewGroup, false);
  }
}

Bir tür uyumsuzluğu hatası gettng. Yazıma bir göz atabilir misin? stackoverflow.com/questions/28334800/…
Schardt12


Kodunuzun sorunu nedir?
user1510006

Merhaba sen bunu okuyabilir postayı tam kod sağlanan çok basit bir cevap.
Nirmal Dhara

Yanıtlar:


518

Bu çok sık sorulan bir soru olduğundan, ViewPager'i birden fazla Parça ve Düzen ile ayrıntılı olarak açıklamak için zaman ve çaba harcamak istedim. Hadi bakalım.

Birden Fazla Parça ve Düzen dosyası içeren ViewPager - Nasıl Yapılır

Aşağıda, farklı parça Türleri ve farklı düzen dosyalarıyla bir ViewPager'in nasıl uygulanacağının tam bir örneği verilmiştir.

Bu durumda, 3 Fragment sınıfı ve her sınıf için farklı bir düzen dosyası var. İşleri basit tutmak için, parça düzenleri yalnızca arka plan renklerinde farklılık gösterir . Tabii ki, Parçalar için herhangi bir düzen dosyası kullanılabilir.

FirstFragment.java turuncu arka plan düzenine, SecondFragment.java yeşil arka plan düzenine ve ThirdFragment.java kırmızı arka plan düzenine sahiptir. Ayrıca, her Parça hangi sınıftan olduğuna ve hangi örneğe bağlı olduğuna bağlı olarak farklı bir metin görüntüler.

Ayrıca destek kütüphanesinin Fragment'ı kullandığımı da unutmayın: android.support.v4.app.Fragment

MainActivity.java ( Viewpager'ı başlatır ve bunun için bir iç sınıf olarak adaptöre sahiptir). Yine ithalata bir bakın . android.support.v4Paketi kullanıyorum .

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;

public class MainActivity extends FragmentActivity {

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

        ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
        pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
    }

    private class MyPagerAdapter extends FragmentPagerAdapter {

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int pos) {
            switch(pos) {

            case 0: return FirstFragment.newInstance("FirstFragment, Instance 1");
            case 1: return SecondFragment.newInstance("SecondFragment, Instance 1");
            case 2: return ThirdFragment.newInstance("ThirdFragment, Instance 1");
            case 3: return ThirdFragment.newInstance("ThirdFragment, Instance 2");
            case 4: return ThirdFragment.newInstance("ThirdFragment, Instance 3");
            default: return ThirdFragment.newInstance("ThirdFragment, Default");
            }
        }

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

activity_main.xml (MainActivitys .xml dosyası) - yalnızca tüm ekranı kaplayan ViewPager'i içeren basit bir düzen dosyası.

<android.support.v4.view.ViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/viewPager"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />

Fragment sınıfları, FirstFragment.java içe aktarma android.support.v4.app.Fragment;

public class FirstFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.first_frag, container, false);

        TextView tv = (TextView) v.findViewById(R.id.tvFragFirst);
        tv.setText(getArguments().getString("msg"));

        return v;
    }

    public static FirstFragment newInstance(String text) {

        FirstFragment f = new FirstFragment();
        Bundle b = new Bundle();
        b.putString("msg", text);

        f.setArguments(b);

        return f;
    }
}

first_frag.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_orange_dark" >

    <TextView
        android:id="@+id/tvFragFirst"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:textSize="26dp"
        android:text="TextView" />
</RelativeLayout>

SecondFragment.java

public class SecondFragment extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.second_frag, container, false);

    TextView tv = (TextView) v.findViewById(R.id.tvFragSecond);
    tv.setText(getArguments().getString("msg"));

    return v;
}

public static SecondFragment newInstance(String text) {

    SecondFragment f = new SecondFragment();
    Bundle b = new Bundle();
    b.putString("msg", text);

    f.setArguments(b);

    return f;
}
}

second_frag.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_green_dark" >

    <TextView
        android:id="@+id/tvFragSecond"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:textSize="26dp"
        android:text="TextView" />

</RelativeLayout>

ThirdFragment.java

public class ThirdFragment extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.third_frag, container, false);

    TextView tv = (TextView) v.findViewById(R.id.tvFragThird);      
    tv.setText(getArguments().getString("msg"));

    return v;
}

public static ThirdFragment newInstance(String text) {

    ThirdFragment f = new ThirdFragment();
    Bundle b = new Bundle();
    b.putString("msg", text);

    f.setArguments(b);

    return f;
}
}

third_frag.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_red_light" >

    <TextView
        android:id="@+id/tvFragThird"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:textSize="26dp"
        android:text="TextView" />

</RelativeLayout>

Sonuç şu şekildedir:

Viewpager 5 Parçayı tutar, Parçacıklar 1 FirstFragment türündedir ve first_frag.xml düzenini görüntüler, Parça 2 SecondFragment türündedir ve second_frag.xml dosyasını görüntüler ve 3-5 Parçası da ThirdFragment türündedir ve hepsi third_frag.xml dosyasını görüntüler .

resim açıklamasını buraya girin

Yukarıda, sola veya sağa kaydırarak değiştirilebilen 5 Parçayı görebilirsiniz. Elbette aynı anda yalnızca bir Parça görüntülenebilir.

Sonuncu ama bir o kadar önemli:

Fragment sınıflarınızın her birinde boş bir kurucu kullanmanızı öneririm .

Potansiyel parametreleri yapıcı üzerinden teslim etmek yerine, newInstance(...)yöntemi ve Bundleparametreleri teslim etmek için kullanın .

Bu şekilde, nesne durumu ayrılır ve yeniden eklenirse bağımsız değişkenler aracılığıyla saklanabilir. Çok Bundlesbağlı gibi Intents.


7
@PhilippJahoda harika cevap, teşekkürler. I ViewPager daha Fragment tanımlandığı takdirde, bir şey olsa bahsetmek istiyoruz getSupportChildFragmentManager () yerine getSupportFragmentManager arasında kullanılmalıdır () adaptör oluştururken. Aksi takdirde yön değiştirme gerçekleştiğinde kod kırılır.
guy.gc

5
Evet doğru. Ancak benim örneğimde ViewPager bir Etkinlik'te tanımlanmıştır ve bu nedenle getSupportFragmentManager () uygundur. Ayrıca getSupportChildFragmentManager () yöntemi yok, getChildFragmentManager () için başvurduğunuzu varsayıyorum.
Philipp Jahoda

1
V13 destek paketini kullanırken ViewPager'i yerel parçalarla kullanabilirsiniz. developer.android.com/reference/android/support/v13/app/…
Philipp Jahoda

1
Android Lollipop 5.0'dan itibaren, bu hala geçerli mi?
Orkun Ozen

5
MyPagerAdapter -> getItem (int pos) yönteminizde her zaman hedef parçanın yeni bir örneğini alırsınız (pos değerine göre). Böylece cihazınızı her döndürdüğünüzde (yön değiştirme) getItem yöntemi çağrılır ve tekrar tekrar parçalar oluşturulur. Ancak yaratıldıktan sonra parça yöneticisinde saklanırlar. Zaten parça yöneticisinde olup olmadıklarını kontrol etmeniz gerektiğini düşünüyorum çünkü hafızayı boşa harcamıyorsanız. Bkz pastebin.com/0bJc9mHA
rekt0x

8

Bir dizi görünüm oluşturun ve bunu aşağıdakilere uygulayın: container.addView(viewarr[position]);

public class Layoutes extends PagerAdapter {

    private Context context;
    private LayoutInflater layoutInflater;
    Layoutes(Context context){
        this.context=context;
    }
    int layoutes[]={R.layout.one,R.layout.two,R.layout.three};
    @Override
    public int getCount() {
        return layoutes.length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return (view==(LinearLayout)object);
    }
    @Override
    public Object instantiateItem(ViewGroup container, int position){
        layoutInflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View one=layoutInflater.inflate(R.layout.one,container,false);
        View two=layoutInflater.inflate(R.layout.two,container,false);
        View three=layoutInflater.inflate(R.layout.three,container,false);
        View viewarr[]={one,two,three};
        container.addView(viewarr[position]);
        return viewarr[position];
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object){
        container.removeView((LinearLayout) object);
    }

}

Görünüm dizileri oluşturarak ViewPager'daki mizanpajları şişirebiliriz.
akash ingle

6

Parça ekleme kodu

public Fragment getItem(int position) {

    switch (position){
        case 0:
            return new Fragment1();

        case 1:
            return new Fragment2();

        case 2:
            return new Fragment3();

        case 3:
            return new Fragment4();

        default:
            break;
    }

    return null;
}

Her fragman için xml dosyası oluşturun, örneğin Fragment1 için, fragment_one.xml dosyasını düzen dosyası olarak kullanın, Fragment1 java dosyasında aşağıdaki kodu kullanın.

public class Fragment1 extends Fragment {

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_one, container, false);

        return view;

    }
}

Daha sonra gerekli düzeltmeleri yapabilirsiniz .. Benim için çalıştı.


4

Temel ViewPager Örneği

Bu cevap, belgelerin , bu öğreticinin ve kabul edilen yanıtın basitleştirilmesidir . Amacı, ViewPagermümkün olan en kısa sürede çalışmaya başlamaktır. Bundan sonra başka düzenlemeler yapılabilir.

resim açıklamasını buraya girin

XML

Ana etkinlik ve her sayfa (parça) için xml mizanpajlarını ekleyin. Bizim durumumuzda sadece bir parça düzeni kullanıyoruz, ancak farklı sayfalarda farklı düzenleriniz varsa, her biri için bir tane yapın.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.verticalviewpager.MainActivity">

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

fragment_one.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent" >

    <TextView
        android:id="@+id/textview"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

</RelativeLayout>

kod

Bu, ana etkinliğin kodudur. Bu içerir PagerAdapterve FragmentOnegibi, iç sınıfları. Bunlar çok büyürse veya başka yerlerde yeniden kullanıyorsanız, bunları kendi ayrı sınıflarına taşıyabilirsiniz.

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;

public class MainActivity extends AppCompatActivity {

    static final int NUMBER_OF_PAGES = 2;

    MyAdapter mAdapter;
    ViewPager mPager;

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

        mAdapter = new MyAdapter(getSupportFragmentManager());
        mPager = findViewById(R.id.viewpager);
        mPager.setAdapter(mAdapter);
    }

    public static class MyAdapter extends FragmentPagerAdapter {
        public MyAdapter(FragmentManager fm) {
            super(fm);
        }

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

        @Override
        public Fragment getItem(int position) {

            switch (position) {
                case 0:
                    return FragmentOne.newInstance(0, Color.WHITE);
                case 1:
                    // return a different Fragment class here
                    // if you want want a completely different layout
                    return FragmentOne.newInstance(1, Color.CYAN);
                default:
                    return null;
            }
        }
    }

    public static class FragmentOne extends Fragment {

        private static final String MY_NUM_KEY = "num";
        private static final String MY_COLOR_KEY = "color";

        private int mNum;
        private int mColor;

        // You can modify the parameters to pass in whatever you want
        static FragmentOne newInstance(int num, int color) {
            FragmentOne f = new FragmentOne();
            Bundle args = new Bundle();
            args.putInt(MY_NUM_KEY, num);
            args.putInt(MY_COLOR_KEY, color);
            f.setArguments(args);
            return f;
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mNum = getArguments() != null ? getArguments().getInt(MY_NUM_KEY) : 0;
            mColor = getArguments() != null ? getArguments().getInt(MY_COLOR_KEY) : Color.BLACK;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.fragment_one, container, false);
            v.setBackgroundColor(mColor);
            TextView textView = v.findViewById(R.id.textview);
            textView.setText("Page " + mNum);
            return v;
        }
    }
}

bitmiş

Yukarıdaki üç dosyayı projenize kopyalayıp yapıştırdıysanız, uygulamayı çalıştırabilmeniz ve sonucu yukarıdaki animasyonda görebilmeniz gerekir.

Devam ediyor

ViewPagers ile yapabileceğiniz birkaç şey var. Başlamak için aşağıdaki bağlantılara bakın:


3

Bu da iyidir:

<android.support.v4.view.ViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/viewPager"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />
public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
        pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));

    }
}


public class FragmentTab1 extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragmenttab1, container, false);
        return rootView;
    }
}

class MyPagerAdapter extends FragmentPagerAdapter{

    public MyPagerAdapter(FragmentManager fragmentManager){
        super(fragmentManager);

    }
    @Override
    public android.support.v4.app.Fragment getItem(int position) {
        switch(position){
            case 0:
                FragmentTab1 fm =   new FragmentTab1();
                return fm;
            case 1: return new FragmentTab2();
            case 2: return new FragmentTab3();
        }
        return null;
    }

    @Override
    public int getCount() {
        return 3;
    }
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/Fragment1" />

</RelativeLayout>

0

Parçalarınızda yeni örnekler oluşturun ve Etkinliğinizde böyle yapın

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

    @Override
    public Fragment getItem(int position) {
        switch(position){
            case 0:
                return Fragment1.newInstance();
            case 1:
                return Fragment2.newInstance();
            case 2:
                return Fragment3.newInstance();
            case 3:
                return Fragment4.newInstance();


            default: break;

        }
        return null;
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.