[英]How to switch to the first fragment when selecting an item from the recyclerView of second Fragment? Both fragments are in tablayout with viewPager2
[英]Fragments not visible when switch tabs using ViewPager and TabLayout
我有一個HostActivity
,它使用ViewPager
和TabLayout
在多個片段之間切換。 當我在選項卡之間切換時,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.