简体   繁体   English

使用viewpager更改片段时,如何使图像停留在imageview中?

[英]How to make image stays in imageview when fragment is changed using viewpager?

I have an activity that's using viewpager to manage 4 pages. 我有一个使用Viewpager管理4个页面的活动。 The user can go to the next or previous page by clicking the next and back button in action bar. 用户可以通过单击操作栏中的下一个和上一个按钮来转到下一页或上一页。 I have an imageview in fragment4. 我在fragment4中有一个imageview。 The problem is when i add an image in fragment4 and when i click back button it will bring me to fragment3. 问题是,当我在fragment4中添加图像时,当我单击“后退”按钮时,它将带我进入fragment3。 And after that when i click next button it will bring me to fragment4 again and the image is still available. 之后,当我单击下一步按钮时,它将再次将我带到fragment4,并且图像仍然可用。 But why when i click back and back button and it will bring me to fragment2 then i click next and next button; 但是为什么当我单击“后退”和“后退”按钮时,它将带我进入fragment2,然后单击“下一步”和“下一个”按钮; in the fragment4 the image is no longer available? 在fragment4中,该图像不再可用? How i can make the image to be available as long as the activity is not destroyed? 只要不破坏活动,我如何使图像可用? Sorry for the poor english and description. 对不起,英语和描述很差。 I hope i don't confuse you and hopefully you can share some thoughts and solutions on this. 希望我不要让您感到困惑,并希望您可以就此分享一些想法和解决方案。 Thank you. 谢谢。

在此处输入图片说明

Fragment4 xml: Fragment4 xml:

<ImageView
    android:id="@+id/imageView"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:scaleType="fitXY"
    android:layout_centerInParent="true"
    android:visibility="visible"
    android:background="@drawable/ic_control_point_black_24dp"
    android:layout_marginBottom="10dp"/>

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/tap_add_replace_photo"
    android:textAlignment="center"/>

Fragment4 java: Fragment4 Java:

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    setHasOptionsMenu(true);

    View view = inflater.inflate(R.layout.fragment_create_activity_page_four, container, false);

    imageViewPhoto = view.findViewById(R.id.imageView);

    imageViewPhoto.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            choosePhoto();
        }
    });

    currentUser = FirebaseAuth.getInstance().getCurrentUser();
    activityId = ref.getId();

    return view;
}

public void choosePhoto(){
    try{

        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);

    }catch (Exception e){
        Toast.makeText(getActivity(), e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == PICK_IMAGE_REQUEST && resultCode == Activity.RESULT_OK && data != null &&
            data.getData() != null){
        try
        {
            uri = data.getData();
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);
            imageViewPhoto.setImageBitmap(bitmap);
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    //hide soft keyboard
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);

    int id = item.getItemId();

    if (id == android.R.id.home) {
        ((ActivityCreateActivity)getActivity()).getViewPager().setCurrentItem(2);
        return true;
    }else if (id == R.id.action_publish) {
        getValue();
        return true;
    }

    return super.onOptionsItemSelected(item);
}

You should be set mViewPager.setOffscreenPageLimit(3); 您应该设置为mViewPager.setOffscreenPageLimit(3); in your viewpager 在您的viewpager中

Fragments view will be destroyed when it's scrolled too far, you must store the state in a custom field, and re-use that value in onCreateView . 滚动太远时,Fragments视图将被破坏,您必须将状态存储在自定义字段中,然后在onCreateView重新使用该值。

If you want to see how it works exactly, add debug logs to onCreateView and onDestroyView . 如果要查看其工作原理,请将调试日志添加到onCreateViewonDestroyView

But if you don't have too many pages, increasing offscreen limit might be enough. 但是,如果您没有太多页面,那么增加屏幕外限制可能就足够了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM