问题描述
换页后,Tablayout Imageview数据消失了,每个选项卡中都有两个imageview,当我更改选项卡时,从图库中选择的图像将失效,我不知道该如何解决
我也尝试过 Tab content disappeared after change page
PagerAdapter
public class PagerAdapter extends FragmentStatePagerAdapter
{
final int pageCount = 3;
private String tabTitles[] = new String[]{"Tab 1","Tab 2","Tab 3",};
public PagerAdapter(@NonNull FragmentManager fm) {
super(fm,BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
}
@NonNull
@Override
public Fragment getItem(int position) {
switch (position){
case 0:
return new FirstFragment();
case 1:
return new SecondFragment();
case 2:
return new ThirdFragment();
default:
return null;
}
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return tabTitles[position];
}
@Override
public int getCount() {
return pageCount;
}
}
FirstFragment
public class FirstFragment extends Fragment implements View.OnClickListener{
ImageView imageButton1;
ImageButton imageButton2;
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v= inflater.inflate(R.layout.fragment_first,container,false);
imageButton1 = (ImageView) v.findViewById(R.id.firstimagebtn);
imageButton2 = (ImageButton)v.findViewById(R.id.secondimagebtn);
imageButton1.setonClickListener(this::onClick);
imageButton2.setonClickListener(this::onClick);
return v;
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.firstimagebtn:
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent,0);
break;
case R.id.secondimagebtn:
Intent intent2 = new Intent(Intent.ACTION_PICK);
intent2.setType("image/*");
startActivityForResult(intent2,1);
break;
}
}
@Override
public void onActivityResult(int requestCode,int resultCode,@Nullable Intent data) {
super.onActivityResult(requestCode,resultCode,data);
switch(requestCode) {
case 0:
if(resultCode == Activity.RESULT_OK){
Uri selectedImage = data.getData();
imageButton1.setimageURI(selectedImage);
}
break;
case 1:
if(resultCode == Activity.RESULT_OK){
Uri selectedImage = data.getData();
imageButton2.setimageURI(selectedImage);
}
break;
}
}
解决方法
由于您使用FragmentStatePagerAdapter,因此请记住:
当存在大量页面(更像列表视图)时,此版本的寻呼机更有用。 当用户看不到页面时,页面的整个片段可能会被破坏,仅保留该片段的保存状态 。与FragmentPagerAdapter相比,这使分页器可以保留与每个访问的页面关联的更少的内存,但在页面之间进行切换时可能会产生更多开销。
简而言之,FirstFragment
上ImageView的数据消失了,因为FirstFragment
被破坏,因为当您切换到另一个标签/片段时,FragmentStatePagerAdapter
的性质
现在,您只需简单地为片段保存状态即可解决此问题
public class FirstFragment extends Fragment implements View.OnClickListener{
ImageView imageButton1;
ImageButton imageButton2;
private static final String ARG_URI_IMAGE_1 = "image1Uri"
private static final String ARG_URI_IMAGE_2 = "image2Uri"
private String mUriImg1;
private String mUriImg2;
@Override
public void onViewCreated(@NonNull View view,@Nullable Bundle savedInstanceState) {
if (savedInstanceState != null) {
mUriImg1 = savedInstanceState.getString(ARG_URI_IMAGE_1);
mUriImg2 = savedInstanceState.getString(ARG_URI_IMAGE_2);
if (mUriImg1 != null) {
imageButton1.setImageURI(Uri.parse(mUriImg1))
}
if (mUriImg2 != null) {
imageButton2.setImageURI(Uri.parse(mUriImg2))
}
}
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
if (mUriImg1 != null) {
outState.putString(ARG_URI_IMAGE_1,mUriImg1);
}
if (mUriImg2 != null) {
outState.putString(ARG_URI_IMAGE_2,mUriImg2);
}
}
@Override
public void onActivityResult(int requestCode,int resultCode,@Nullable Intent data) {
super.onActivityResult(requestCode,resultCode,data);
switch(requestCode) {
case 0:
if(resultCode == Activity.RESULT_OK){
Uri uri = data.getData();
mUriImg1 = uri.toString();
imageButton1.setImageURI(uri);
}
break;
case 1:
if(resultCode == Activity.RESULT_OK){
Uri uri = data.getData();
mUriImg2 = uri.toString();
imageButton2.setImageURI(uri);
}
break;
}
}
}