Tablayout Imageview 数据在页面更改后消失

Tablayout Imageview data disappeared after page change

Tablayout 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;
    }
}

第一个片段

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,请记住:

This version of the pager is more useful when there are a large number of pages, working more like a list view. When pages are not visible to the user, their entire fragment may be destroyed, only keeping the saved state of that fragment. This allows the pager to hold on to much less memory associated with each visited page as compared to FragmentPagerAdapter at the cost of potentially more overhead when switching between pages.

简而言之,你FirstFragment上的ImageView的数据消失了,因为FirstFragment在你切换到另一个tab/fragment时被破坏了FragmentStatePagerAdapter[=16=的性质]

现在你可以通过正确保存片段的状态来解决这个问题

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;
       }
   }
}