Как я могу передать информацию своим фрагментам внутри вкладок ViewPager? - PullRequest
0 голосов
/ 07 августа 2020

У меня есть основное домашнее действие, которое состоит из 3 вкладок внизу экрана.

Внутри этого activity У меня fragment.

Этот фрагмент содержит view pager. Этот пейджер просмотра используется для перехода между двумя действиями:

1. Форма упражнения = Отображает видео для упражнения.

2. История упражнений = Здесь отображаются все данные, записанные пользователями. упражнение.

объяснение_фото

Чтобы получить видео формы упражнения, а также историю упражнений, мне нужно иметь доступ к ExerciseName из ProgressFagment2 (текст в верхней части экрана) и передать его 2 дочерним элементам фрагменты (ExerciseHomeVideoFragment и ExerciseHistoryFragment)

Как мне получить доступ к exerciseName в дочерних фрагментах?

ProgressFragment2 (Фрагмент внутри действия)

public class Progress_Fragment2 extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.exercises_history_demo, container, false);

    }

    public void onViewCreated(View view, Bundle savedInstanceState) {

         childExerciseName = getArguments().getString("ExerciseName");

        TextView title_tv = getView().findViewById(R.id.textView_exerciseName8);
        title_tv.setText(childExerciseName);

        SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager());
        // Set up the ViewPager with the sections adapter.
        ViewPager mViewPager = (ViewPager) getView().findViewById(R.id.view_pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);
        TabLayout tabLayout = (TabLayout) getView().findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(mViewPager);

    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // Inflate the menu; this adds items to the action bar if it is present.
        inflater.inflate(R.menu.top_navigation_two, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return super.onOptionsItemSelected(item);
    }

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

        @Override
        public Fragment getItem(int position) {
            Fragment fragment = null;
            switch (position) {
                case 0:
                    fragment = new ExerciseHomeVideoFragment();
                    break;
                case 1:
                    fragment = new ExerciseHistoryFragment();
                    break;

            }
            return fragment;
        }

        @Override
        public int getCount() {
            // Show 2 total pages.
            return 2;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "Exercise Form";
                case 1:
                    return "Exercise History";
            }
            return null;
        }
    }
}

ExerciseHomeVideoFragment (один из 2 фрагментов внутри viewPager) | Только соответствующий код

public class ExerciseHomeVideoFragment extends Fragment implements View.OnClickListener {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        return inflater.inflate(R.layout.fragment_exercise_info_home_version, container, false);
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    public void onViewCreated(View view, Bundle savedInstanceState) {


        Progress_Fragment2 parentFrag = ((Progress_Fragment2)ExerciseHomeVideoFragment.this.getParentFragment());


        youTubeBtn = getView().findViewById(R.id.youTubeSearchButton);
        parent_tv = getView().findViewById(R.id.textView_exerciseName8);

  childExerciseViewModel = ViewModelProviders.of(this).get(ChildExerciseViewModel.class);

//
// HOW CAN I ACCESS THE CHILDEXERCISE NAME???
//

        
//         childExerciseName = getArguments().getString("ExerciseName"); // THIS DOESNT WORK
       
 //  exerciseNameTV.setText(childExerciseName + " Demo");

    }
}


Ответы [ 2 ]

1 голос
/ 07 августа 2020

вы можете отправлять данные с помощью интерфейса, аргумента set или newInstance

во фрагменте вкладки

 switch (position) {
        case 0:
          fragment = new ExerciseHomeVideoFragment().newInstance(childExerciseName);
          break;
        case 1:
          fragment = new ExerciseHomeVideoFragment();
          break;

      }

ExerciseHomeVideoFragment

import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class ExerciseHomeVideoFragment extends Fragment {


  public static ExerciseHomeVideoFragment newInstance(String  ExerciseName) {
    Bundle args = new Bundle();

    args.putString("ExerciseName", ExerciseName);
    ExerciseHomeVideoFragment fragment = new ExerciseHomeVideoFragment();
    fragment.setArguments(args);
    return fragment;
  }


  @Nullable
  @Override
  public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    return inflater.inflate(R.layout.fragment_exercise_info_home_version, container, false);
  }

  @RequiresApi(api = Build.VERSION_CODES.O)
  public void onViewCreated(View view, Bundle savedInstanceState) {

    TextView title_tv = getView().findViewById(R.id.textView_exerciseName8);
   //

    Bundle bundle =  getArguments();
    if(bundle!=null)
    {
      title_tv.setText(bundle.getString("ExerciseName"));
    }




  }
}

вы также можете отправить модель, но модель должна быть реализована с помощью Serializer

 switch (position) {
        case 0:

          

          fragment = new ExerciseHomeVideoFragment().newInstance(childExerciseViewModel);
          break;
        case 1:
          fragment = new ExerciseHomeVideoFragment();
          break;

      }

во фрагменте

public static ExerciseHomeVideoFragment newInstance(String  ExerciseName,ChildExerciseViewModel childExerciseViewModel) {
    Bundle args = new Bundle();

    args.putString("ExerciseName", ExerciseName);
    args.putSerializable("model", childExerciseViewModel);
    ExerciseHomeVideoFragment fragment = new ExerciseHomeVideoFragment();
    fragment.setArguments(args);
    return fragment;
  }




 Bundle bundle =  getArguments();
    if(bundle!=null)
    {
      title_tv.setText(bundle.getString("ExerciseName"));

      ChildExerciseViewModel  model = (ChildExerciseViewModel) bundle.getSerializable("model");
      title_tv.setText(model.gettourExerciseText());
    }
0 голосов
/ 07 августа 2020

Я считаю, что лучше использовать архитектуру. например, если вы используете одноэлементный класс для хранения ваших данных, вы сможете использовать их без перехода к фрагменту. поиск по синглтону. Android имеет новую функцию, которая была выпущена 3 месяца спустя. вы можете использовать setFragmentResultListener. вот документация: https://developer.android.com/reference/androidx/fragment/app/FragmentManager#setfragmentresultlistener

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...