विभिन्न Fragments / लेआउट के साथ ViewPager को कैसे लागू करें


191

जब मैं एक गतिविधि शुरू करता हूं, जो दृश्यदर्शी को लागू करता है, तो दृश्यदर्शी ने विभिन्न टुकड़े बनाए। मैं प्रत्येक टुकड़े के लिए अलग-अलग लेआउट का उपयोग करना चाहता हूं, लेकिन समस्या यह है कि व्यूपेजर अधिकतम पर केवल दो लेआउट दिखाता है (1 के बाद शेष सभी टुकड़ों पर दूसरा लेआउट)।

यहाँ SwipeActivity के लिए कोड है जो व्यूप्ले को लागू करता है:

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");
            }
        }
     }
}

यहाँ टुकड़े के लिए कोड है

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

मैंने इस तरह के 5 टुकड़ों का इस्तेमाल किया, सभी में अलग-अलग लेआउट थे, लेकिन व्यूपावर अधिकतम पर केवल 2 दिखाता है।

EDIT : सेकंडफ्रागमेंट के लिए कोड

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);
  }
}

मुझे एक प्रकार की बेमेल त्रुटि मिल रही है। क्या आप मेरी पोस्ट देख सकते हैं? stackoverflow.com/questions/28334800/…
Schardt12


आपके कोड का मुद्दा क्या है?
user1510006

नमस्ते आप इस पोस्ट को बहुत ही सरल जवाब के साथ पूरा कोड प्रदान कर सकते हैं ।
निर्मल धरा

जवाबों:


517

जैसा कि यह बहुत बार पूछा जाने वाला प्रश्न है, मैं समय और प्रयास को कई फ्रेगमेंट और लेआउट के साथ ViewPager को विस्तार से बताना चाहता था। हेयर यू गो।

एकाधिक टुकड़े और लेआउट फ़ाइलों के साथ ViewPager - कैसे करें

निम्नलिखित एक अलग टुकड़ा और विभिन्न लेआउट फ़ाइलों के साथ एक ViewPager को लागू करने के लिए कैसे का एक पूरा उदाहरण है।

इस मामले में, मेरे पास 3 फ्रैगमेंट कक्षाएं हैं, और प्रत्येक कक्षा के लिए एक अलग लेआउट फ़ाइल है। चीजों को सरल रखने के लिए, टुकड़े-टुकड़े केवल उनके पृष्ठभूमि के रंग में भिन्न होते हैं । बेशक, किसी भी लेआउट-फ़ाइल का उपयोग फ्रेगमेंट के लिए किया जा सकता है।

FirstFragment.java में एक ऑरेंज बैकग्राउंड लेआउट है, SecondFragment.java में एक ग्रीन बैकग्राउंड लेआउट है और ThirdFragment.java में एक रेड बैकग्राउंड लेआउट है। इसके अलावा, प्रत्येक खंड एक अलग पाठ प्रदर्शित करता है, यह निर्भर करता है कि यह किस वर्ग से है और यह किस उदाहरण से है।

यह भी जान लें कि मैं सपोर्ट-लाइब्रेरी के फ़्रैगमेंट का उपयोग कर रहा हूं: android.support.v4.app.Fragment

MainActivity.java (प्रारंभिक व्यूपेजर को शुरू करता है और एक आंतरिक वर्ग के रूप में इसके लिए एडेप्टर है)। फिर से आयात पर एक नजर है । मैं android.support.v4पैकेज का उपयोग कर रहा हूं ।

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 फ़ाइल) - एक साधारण लेआउट फ़ाइल, जिसमें केवल ViewPager शामिल है जो पूरे स्क्रीन को भरता है।

<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"
    />

फ्रैगमेंट क्लासेस, FirstFragment.java इंपोर्ट 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>

अंतिम परिणाम निम्नलिखित है:

Viewpager में 5 फ़्रैगमेंट होते हैं, फ़्रैगमेंट 1 प्रकार का फ़र्स्टग्रैगमेंट होता है, और फर्स्ट_फ्रैग.xml लेआउट प्रदर्शित करता है, फ़्रेग्मेंट 2 टाइप सेकंडग्रैगमेंट का होता है और दूसरा_फ्रैग.xml प्रदर्शित करता है, और फ़्रेग्मेंट 3-5 प्रकार का होता है थर्ड फ़्रेग्मेंट और सभी प्रदर्शित होते हैं third_frag.xml ।

यहां छवि विवरण दर्ज करें

ऊपर आप 5 फ़्रैगमेंट देख सकते हैं जिनके बीच में स्वाइप के माध्यम से बाईं या दाईं ओर स्विच किया जा सकता है। पाठ्यक्रम के एक ही समय में केवल एक टुकड़ा प्रदर्शित किया जा सकता है।

अंतिम पर कम नहीं:

मैं आपको सलाह दूंगा कि आप अपने प्रत्येक Fragment Classes में एक खाली कंस्ट्रक्टर का उपयोग करें।

निर्माता के माध्यम से संभावित मापदंडों को सौंपने के बजाय, newInstance(...)विधि और Bundleमापदंडों को सौंपने के लिए उपयोग करें ।

इस तरह से यदि अलग किया गया और ऑब्जेक्ट स्टेट को पुन: संलग्न किया जाता है तो उसे तर्कों के माध्यम से संग्रहीत किया जा सकता है। बहुत कुछ Bundlesसंलग्न है Intents


7
@PhilippJahoda शानदार जवाब, धन्यवाद। मैं एक बात का उल्लेख करना चाहूंगा, अगर ViewPager को GetSupportChildFragmentManager () की तुलना में एक फ़्रैगमेंट में परिभाषित किया गया है, तो एडेप्टर बनाते समय getSupportFragmentManager () के बजाय उपयोग किया जाना चाहिए। अन्यथा ओरिएंटेशन परिवर्तन होने पर कोड टूट जाता है।
guy.gc

5
हां यह सही है। लेकिन मेरे उदाहरण में ViewPager को एक गतिविधि में परिभाषित किया गया है, और इसलिए, getSupportFragmentManager () उपयुक्त है। इसके अलावा विधि getSupportChildFragmentManager () मौजूद नहीं है, मुझे लगता है कि आप getChildFragmentManager () का उल्लेख कर रहे हैं।
फिलिप जाहोदा

1
V13 समर्थन पैकेज का उपयोग करते समय आप देशी टुकड़ों के साथ ViewPager का उपयोग कर सकते हैं। डेवलपर
.android.com/reference/android/support/v13/app/…

1
एंड्रॉइड लॉलीपॉप 5.0 के रूप में, क्या यह अभी भी वैध है?
ऑर्कुन ओजेन

5
अपने MyPagerAdapter में -> getItem (int pos) विधि से आपको हमेशा लक्ष्य खंड (स्थिति मान के आधार पर) का एक नया उदाहरण मिलता है। इसलिए हर बार जब आप अपने डिवाइस (ओरिएंटेशन चेंज) को घुमाते हैं, तो गेटमाइट विधि लागू हो जाती है और बार-बार टुकड़े बनते हैं। लेकिन वे सृजन पर खंड प्रबंधक में जमा हो जाते हैं। मुझे लगता है कि आपको जांचना चाहिए कि क्या वे पहले से ही खंड प्रबंधक में हैं क्योंकि यदि आप स्मृति को बर्बाद नहीं करते हैं। देखें pastebin.com/0bJc9mHA
rekt0x

8

व्यूज़ की एक सरणी बनाएँ और इसे लागू करें: 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);
    }

}

व्यू व्यूअर बनाकर हम लेआउट के व्यूपॉगर में वृद्धि कर सकते हैं।
आकाश को

6

टुकड़ा जोड़ने के लिए कोड

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;
}

Fragment1 के लिए प्रत्येक खंड के लिए एक xml फ़ाइल बनाएँ, लेआउट फ़ाइल के रूप में fragment_one.xml का उपयोग करें, Fragment1 जावा फ़ाइल में नीचे दिए गए कोड का उपयोग करें।

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;

    }
}

बाद में आप आवश्यक सुधार कर सकते हैं .. इसने मेरे लिए काम किया।


4

मूल ViewPager उदाहरण

यह उत्तर प्रलेखन , इस ट्यूटोरियल , और स्वीकृत उत्तर का सरलीकरण है । यह उद्देश्य है ViewPagerकि जल्दी से जल्दी काम करना और चलना। उसके बाद और संपादन किए जा सकते हैं।

यहां छवि विवरण दर्ज करें

एक्सएमएल

मुख्य गतिविधि और प्रत्येक पृष्ठ (खंड) के लिए xml लेआउट जोड़ें। हमारे मामले में हम केवल एक खंड लेआउट का उपयोग कर रहे हैं, लेकिन यदि आपके पास अलग-अलग पृष्ठों पर अलग-अलग लेआउट हैं तो उनमें से प्रत्येक के लिए बस एक बनाएं।

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>

कोड

यह मुख्य गतिविधि के लिए कोड है। इसमें PagerAdapterऔर FragmentOneभीतर की कक्षाएं शामिल हैं। यदि ये बहुत बड़े हो जाते हैं या आप अन्य स्थानों पर इनका पुन: उपयोग कर रहे हैं, तो आप इन्हें अपनी अलग कक्षाओं में स्थानांतरित कर सकते हैं।

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;
        }
    }
}

ख़त्म होना

यदि आपने अपनी परियोजना में ऊपर की तीन फ़ाइलों को कॉपी और पेस्ट किया है, तो आपको ऐप को चलाने और ऊपर दिए गए एनीमेशन में परिणाम देखने में सक्षम होना चाहिए।

पर जा रहा

काफी कुछ चीजें हैं जो आप ViewPagers के साथ कर सकते हैं। आरंभ करने के लिए निम्नलिखित लिंक देखें:


3

यह भी ठीक है:

<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

अपने अंशों में नए उदाहरण बनाएं और अपनी गतिविधि में ऐसा करें

 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;
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.