页面更改后,Tablayout Imageview数据消失了

问题描述

换页后,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;
       }
   }
}