Фрагменты не видны при переключении вкладок с помощью ViewPager и TabLayout - PullRequest
0 голосов
/ 25 мая 2018

У меня есть HostActivity, который использует ViewPager и TabLayout для переключения между несколькими фрагментами.Когда я переключаюсь между вкладками, экземпляр Fragments действительно получает обновленные данные.Я также вижу обновленные данные в onCreateView экземпляра Fragment, но TextView.setText не обновляется.Когда я проверяю видимость Fragment, он всегда показывает Невидимый.Как сделать фрагмент видимым при переключении вкладок, чтобы представление обновлялось новыми данными?Чего-то не хватает в жизненном цикле фрагмента / действия?Я впервые использую ViewPager, поэтому будет полезно узнать, что я что-то упустил.

Класс фрагмента:

public class StepFragment extends Fragment { @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (getArguments() != null) {
            step = getArguments().getParcelable(SELECTED_STEP);
            mDescription = step.getDescription();
        }

        View view = inflater.inflate(R.layout.step_fragment, container, false);
        ButterKnife.bind(this,view);
        Log.e(TAG, "onCreateView: "+mDescription); **// THIS GETS UPDATED DATA**
        tvStepDescription.setText(mDescription);
        }
        return view;
    }
 }

Вот моя активность хоста:

public class StepActivity extends AppCompatActivity {
...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_step);
        fragmentSelectAdapter = new StepFragmentSelectAdapter(getSupportFragmentManager(),this,steps,recipe);
        mViewPager.setAdapter(fragmentSelectAdapter);
        mTabLayout.setupWithViewPager(mViewPager);
        stepFragment = (StepFragment) getSupportFragmentManager().findFragmentById(R.id.step_container);
        if(stepFragment == null) {
            stepFragment = StepFragment.newInstance(step, recipe);
            stepFragment.setArguments(bundle);
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.step_container, stepFragment)
                    .commit();
        } else {
            stepFragment = StepFragment.newInstance(step, recipe);
            stepFragment.setArguments(bundle);
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.step_container, stepFragment)
                    .commit();
        }
    }
}

Вот мой FragmentPagerAdapter, который, кажется, получает правильные данные в соответствии с положением вкладки в методе getItem:

public class StepFragmentSelectAdapter extends FragmentPagerAdapter {
...
   @Override
    public Fragment getItem(int position) {
        **// THIS GETS UPDATED DATA**
        Log.e(TAG, "getItem: \nDecr: "+steps.get(position).getDescription()+"\nVideo: "+steps.get(position).getVideoURL()+"\nImage: "+steps.get(position).getThumbnailURL());
        return StepFragment.newInstance(steps.get(position),recipe);
    }

    @Override
    public int getCount() {
        if (steps == null){
            return 0;
        }
        return steps.size();
    }
...
}

ScreenShot:

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Спасибо за подсказку.Я обошел эту проблему, заменив ActionBar на пользовательский ToolBar на back ImageButton и используя прослушиватель щелчков, чтобы вернуться к вызывающему действию.

backButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getActivity().onBackPressed();
            }
        });
0 голосов
/ 25 мая 2018

Насколько я могу понять о проблеме, с которой вы столкнулись, я думаю, вам следует реализовать функцию onResume в вашем StepFragment, которая будет получать обновленные данные из какого-то источника и отображать это в * 1003.*.Тем не менее, я могу думать о потенциальной проблеме в вашем StepFragmentSelectAdapter.Вы создаете новый экземпляр каждый раз, когда переключаете вкладки.

Вы должны создать экземпляры Fragment, созданные ранее, и, если вы собираетесь передавать данные между фрагментами, вы можете рассмотреть возможность использования функции BroadcasReceiver или слушателя, реализовав interface.

Так что PagerAdapter должно выглядеть примерно так.

public class StepFragmentSelectAdapter extends FragmentPagerAdapter {

   public ArrayList<StepFragment> stepFragments;

   public StepFragmentSelectAdapter(ArrayList<Step> steps) {
       stepFragments = new ArrayList<>(); 

       for(int i = 0; i < steps.size(); i++) {
           stepFragments.add(StepFragment.newInstance(steps.get(position),recipe));
       }
   }
...
   @Override
    public Fragment getItem(int position) {
        **// THIS GETS UPDATED DATA**
        Log.e(TAG, "getItem: \nDecr: "+steps.get(position).getDescription()+"\nVideo: "+steps.get(position).getVideoURL()+"\nImage: "+steps.get(position).getThumbnailURL());
        return stepFragments.get(position);
    }

    @Override
    public int getCount() {
        if (steps == null){
            return 0;
        }
        return steps.size();
    }
...
}
...