簡體   English   中英

使用ViewPager和TabLayout切換選項卡時,片段不可見

[英]Fragments not visible when switch tabs using ViewPager and TabLayout

我有一個HostActivity ,它使用ViewPagerTabLayout在多個片段之間切換。 當我在選項卡之間切換時,Fragments實例確實會獲取更新的數據。 我還在Fragment實例的onCreateView中看到了更新的數據,但是TextView.setText沒有得到更新。 當我檢查Fragment的可見性時,它始終顯示Invisible。 切換標簽時如何使片段可見,以便使用新數據更新視圖? 片段/活動生命周期中缺少什么嗎? 我是第一次實現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();
    }
...
}

屏幕截圖:

據我對您所遇到的問題的了解,我認為您應該在StepFragment實現onResume函數,該函數將從某些源獲取更新的數據並將其顯示在TextView 但是,我可以想到您的StepFragmentSelectAdapter中的潛在問題。 每次切換選項卡時,您都在創建一個新實例。

您應該在之前創建Fragment實例,並且如果要在片段之間傳遞數據,則可以考慮通過實現interface來擁有BroadcasReceiver或listener函數。

因此, 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();
    }
...
}

感謝您的提示。 我通過更換解決這個問題了ActionBar帶有自定義ToolBar與背部ImageButton和使用點擊監聽,讓回調用活動。

backButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getActivity().onBackPressed();
            }
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM