Podmienianie danych we Fragmencie przy użyciu interfejsu

0

Witajcie,

próbuje podmienić te dane (trzy odsłony tego samego Fragmentu, ale za każdym razem z innymi danymi)

fragmentList = new ArrayList<>();
        fragmentList.add(new Fragment1(getResources().getString(R.string.text_page_1), R.drawable.swans, new String[]{getResources().getString(R.string.answer1), getResources().getString(R.string.answer2),getResources().getString(R.string.answer3)},false));
        fragmentList.add(new Fragment1(null, R.drawable.image_file, null, true));
        fragmentList.add(new Fragment1(getResources().getString(R.string.text_page_2), R.drawable.nature, new String[]{getResources().getString(R.string.answer5),getResources().getString(R.string.answer6)},false));

używając do tego interfejsu

interface viewPagerFragmentInterface{

     void onResumeFragment(Element.DataType variableName);
     void onPauseFragment(Element.DataType variableName2);
     }


public class Fragment1 extends Fragment implements viewPagerFragmentInterface {


        String stringValue;
        int imagesResId;
        TextView text;
        String[] rbData;
        RadioGroup radioButtons;
        boolean mapImage;
        View answer;

    public void onResumeFragment(Element.DataType variableName) {
        Log.d("onResume get call when"," Activity or viewpager adapter call it variableName=> "+ variableName);
    }
    public void onPauseFragment(Element.DataType variableName2) {
        Log.d("onPause get call when"," Activity or viewpager adapter call it variableName=> "+ variableName2);
    }

i próbując dalej w MainActivity

 @Override
            public void onPageSelected(int position) {

                viewPagerFragmentInterface fragmentToShow = (viewPagerFragmentInterface) fragmentList.get(position);
                fragmentToShow.onResumeFragment();

                viewPagerFragmentInterface fragmentToHide = (viewPagerFragmentInterface) fragmentList.get(currentPosition);
                fragmentToHide.onPauseFragment();

Oczywiście kod w metodzie onPageSelected jest niekompletny, jak i ten wyżej we Fragmencie. No i ogólnie nie wiem już jak to zrobić żeby działało :(

0

@Kubs
na podstawie fragmentów kodu, które zamieściłeś, wnioskuje że chcesz użyć ViewPager wraz z fragmentami. Żeby wszystko ładnie działało nie potrzebujesz tworzyć interfejsu do przekazywania danych do fragmentu.

Sugeruje:

  1. wewnątrz fragmentu dodać statyczną metodę newInstance(p1, p2, ...) przy pomocy której przekażesz dane do fragmentu
public class Fragment1 extends Fragment {
    private static final String TEXT = "text";
    ...

    public static Fragment1 newInstance(String parametr1, int parametr2, String[] parametr3, boolean paramentr3) {
        Fragment1 fragment = new Fragment1();
        Bundle args = new Bundle();
        if (parametr1 != null && !parametr1.isEmpty()) {
            args.
        }
        // podobnie dla pozostałych parametrów
        return fragment;
    }

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

        // Wyciągasz argumenty przekazane przy tworzeniu fragmentu
        Bundle args = getArguments();
        if (args != null) {
            if (args.containsKey(TEXT) {
                String text = args.getString(TEXT);
                // robisz coś z textem
            }
            // podobnie dla pozostałych
        }

        return v;
    }
    ...
}
  1. utworzyć własny FragmentPagerAdapter:
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {

    public MyFragmentPagerAdapter (FragmentManager fragmentManager) {
            super(fragmentManager);
    }
    ...
    @Override
        public Fragment getItem(int position) {
            switch (position) {
            case 0:
                return Fragment1.newInstance(getResources().getString(R.string.text_page_1), R.drawable.swans, new String[]{getResources().getString(R.string.answer1), getResources().getString(R.string.answer2),getResources().getString(R.string.answer3)},false);
            case 1:
                return Fragment1.newInstance(null, R.drawable.image_file, null, true));
            case 2:
                return Fragment1.newInstance(getResources().getString(R.string.text_page_2), R.drawable.nature, new String[]{getResources().getString(R.string.answer5),getResources().getString(R.string.answer6)},false);
            default:
            	return null;
            }
        }
        ...
        // reszta potrzebnych metod
}
  1. do Twojego viewPager dodaj adapter.

PS
Gdybyś zamieścił kilka dodatkowych informacji, miałabym szerszy obraz tego, co chcesz zrobić.

0

widze ze dalej meczysz sie z tym... czytales chociaz z 1 kurs androida i z 1 kurs javy? zrob zip'a projektu dodaj go tutaj i zobacze co tam nie bangla w tym kodzie

0
Mrch napisał(a):
  1. wewnątrz fragmentu dodać statyczną metodę newInstance(p1, p2, ...) przy pomocy której przekażesz dane do fragmentu

Zawsze mnie to zadziwia. Zamiast kliknąć w Android Studio New->Fragment, gdzie wygenerowany zostanie poprawny szablon (łącznie ze wspomnianą metodą newInstance), to nie - trzeba rzeźbić samemu i wymyślać kombinacje alpejskie. Bo tak lepiej. Niech kolega doda nowy fragment przez GUI Android Studio, wygeneruje się szablon fragmentu z jego inicjalizacją, komentarzami i przykładem jak przekazać do niego dane.

0

@Mrch:

MainActivity

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {

                viewPagerFragmentInterface fragmentToShow = (viewPagerFragmentInterface) fragmentList.get(position);
                fragmentToShow.onResumeFragment(str, imageView, rb, map);



                viewPagerFragmentInterface fragmentToHide = (viewPagerFragmentInterface) fragmentList.get(currentPosition);
                fragmentToHide.onPauseFragment(str, imageView, rb, map);


        FragmentSliderAdapter adapter = new FragmentSliderAdapter(getSupportFragmentManager(), fragmentList);
        viewPager.setAdapter(adapter);

oraz (jeszcze nie mam ustawionego obiektu maps w if'ie)

@Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            Log.i("x","onCreateViewFragment");

            View view = inflater.inflate(R.layout.fragment_1, container, false);
            text =  view.findViewById(R.id.textView);
            ImageView imageResId = view.findViewById(image);
            answer = view.findViewById((R.id.radioGroup));
            ImageView maps = view.findViewById(map_images);




            if(mapImage){
                view = inflater.inflate(R.layout.maps, container, false);
                maps.



            }else{
                view = inflater.inflate(R.layout.fragment_1, container, false);
                text =  view.findViewById(R.id.textView);
                radioButtons = view.findViewById(R.id.radioGroup);
                text.setText(stringValue);
                imageResId.setImageResource(imagesResId);
            }





            if (answer != null) {
                for (int i = 0; i < radioButtons.getChildCount(); i++) {
                    ((RadioButton) radioButtons.getChildAt(i)).setText(rbData[i]);
                }
            }


            return view;
        }

0

@Kubs

  1. jeśli chcesz na każdej stronie w ViewPager wyświetlać coś innego, to sugeruje zrobić kilka różnych fragmentów, kod będzie dzięki temu czytelniejszy.
  2. w dalszym ciągu nie wiem po co Ci viewPagerFragmentInterface, jeśli potrzebujesz przy tworzeniu fragmentu przekazać mu dane, stwórz go przy użyciu newInstance(p1, p2, ...)
  3. przykład jak używać fragmentów z viewPager znajdziesz tu. W podanym przykładzie w każdej ze stron ładowany jest ten sam fragment z różnymi danymi (każdy fragment jako parametr dostaje inny numer).

1 użytkowników online, w tym zalogowanych: 0, gości: 1