استعمال ViewPager2 للتنقّل من layout لأخرى

ZaFaR97 • منذ 4 سنوات

السلام عليكم؛

أريد استعمال مكتبة ViewPager2 الجديدة للتنقّل بين صفحتين، لكل واحِد layout مختلف؛ بحثت عن شروحاتٍ شتّى لكنّي لم أستطع الوصول لنتيجة جيِّدة؛ أرجو ممن لديه مثال واضح طرحه هنا؛

- أعتذر، قد يكون السؤال بدائيّ جدًا، لكنّني عجزت ولم أفهم شرحًا واضحًا لهذا؛ وليست لدي خبرة سابقة في هذا الجانب.

MyFragmentActivity.java

public class MyFragmentActivity extends AppCompatActivity {

    ViewPager2 viewPager;


    @Override
    protected void onStart() {
        super.onStart();
        setContentView(R.layout.fragment_layout);

        viewPager = findViewById(R.id.pager);
        TabLayout tabLayout = findViewById(R.id.tab_layout);
        viewPager.setAdapter(createCardAdapter());
        new TabLayoutMediator(tabLayout, viewPager,
                (tab, position) -> {
                    if (position == 0) {
                        tab.setText("Tab1");
                    } else if (position == 1) {
                        tab.setText("Tab2");
                    }
                }).attach();
    }


    private ViewPagerAdapter createCardAdapter() {
        return new ViewPagerAdapter(this);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        setContentView(R.layout.fragment_layout);

    }
}

 

ViewPagerAdapter

public class ViewPagerAdapter extends FragmentStateAdapter {
    private static final int CARD_ITEM_SIZE = 2;

    public ViewPagerAdapter(@NonNull FragmentActivity fragmentActivity) {
        super(fragmentActivity);
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return CardFragment.newInstance(position);
    }

    @Override
    public int getItemCount() {
        return CARD_ITEM_SIZE;
    }

    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }
}

 

CardFragment

/**
 * A simple {@link Fragment} subclass.
 * Use the {@link CardFragment#newInstance} factory method to
 * create an instance of this fragment_card.
 */
public class CardFragment extends Fragment {
    private static final String ARG_COUNT = "param1";
    private Integer counter;
    private int[] COLOR_MAP = {
            R.color.colorAccent, R.color.colorPrimaryDark,
    };
    public CardFragment() {
        // Required empty public constructor
    }
    public static CardFragment newInstance(Integer counter) {
        CardFragment fragment = new CardFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_COUNT, counter);
        fragment.setArguments(args);
        return fragment;
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            counter = getArguments().getInt(ARG_COUNT);
        }
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment_card
        return inflater.inflate(R.layout.fragment_card, container, false);
    }
    @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        view.setBackgroundColor(ContextCompat.getColor(getContext(), COLOR_MAP[counter]));
        TextView textViewCounter = view.findViewById(R.id.tv_counter);
        textViewCounter.setText("Fragment No " + (counter+1));
    }
}

 

الإجابة الصحيحة

ZaFaR97 • منذ 4 سنوات

الحل ببساطة (اكتشفته بعد كتابة السؤال بـ 20 ثانية)

 

هو إضافة جملة شرطية في الدّالة التّالية في

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return CardFragment.newInstance(position);
    }

// بحيث تصير مثلًا كالشكل التالي

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        Fragment fragment;
        if (position == 0){
            fragment = CardFragment.newInstance(position);
        } else {
            fragment = CardTowFragment.newInstance(position);
        }
        return fragment;
    }

ملف ViewPagerAdapter

الإجابات (1)

ZaFaR97 • منذ 4 سنوات
الإجابة الصحيحة

الحل ببساطة (اكتشفته بعد كتابة السؤال بـ 20 ثانية)

 

هو إضافة جملة شرطية في الدّالة التّالية في

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return CardFragment.newInstance(position);
    }

// بحيث تصير مثلًا كالشكل التالي

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        Fragment fragment;
        if (position == 0){
            fragment = CardFragment.newInstance(position);
        } else {
            fragment = CardTowFragment.newInstance(position);
        }
        return fragment;
    }

ملف ViewPagerAdapter

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !