繁体   English   中英

Viewpager片段选择器状态

[英]Viewpager fragment selector state

我正在尝试创建一个viewpager,用户可以在其中点击照片,并且照片将处于“突出显示”状态。

我通过在图像上方设置FrameLayout叠加层来达到“突出显示”状态。 问题是,当我在页面上滑动时,状态不仅丢失,而且还显示在未选择的图像上。

这是我的viewpager适配器:

public class ImageSliderAdapter extends FragmentPagerAdapter {

//Image ids from constants
private int[] Images = Constants.Images;


private int mCount = Images.length;

public ImageSliderAdapter$Adapter(FragmentManager fm) {
    super(fm);
}


// The displayed fragment for each position
@Override
public FragmentImageSlider getItem(int position) {

    return  FragmentImageSlider.newInstance(Images[position];
}

@Override
public int getCount() {
    return mCount;
 }
}

这是viewpager返回的片段:

public class FragmentImageSlider extends Fragment {

//Image resource id to show
int imageResourceId;

//Image view of the pic displayed
ImageView image;

// View to indicate highlighted images
View highliteView;


public static FragmentImageSlider newInstance(int imageResourceId){
    FragmentImageSlider f = new FragmentImageSlider();

    Bundle b = new Bundle();

    b.putInt("image", imageResourceId);

    f.setArguments(b);

    return f;
}


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    if (getArguments() !=null) {

        //get image resource id from extras
        imageResourceId = getArguments().getInt("image");
    }

    View root = inflater.inflate(R.layout.displayLayout, null);


    image = (ImageView) root.findViewById(R.id.imageView);
    highliteView = root.findViewById(R.id.highliteView);


    image.setImageResource(imageResourceId);

    //When the image is clicked, toggle the highlighted state
    image.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            //toggle state
            //this view has a selector and changes when selected
            highliteView.setSelected(!highliteView.isSelected());
        }
    });
    return root;
 }
}

所以我的问题是,如何保持突出显示状态?

您可以更改highlight viewvisibility ,而不是selected state

默认情况下,将高亮视图的visibility设置为“ GONE ,选择图像GONE其更改为visible

highliteView.setVisibility(View.GONE);
// when the image is clicked show the highlighted view
image.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       highliteView.setVisibility(View.VISIBLE);
    }
});

根据[FragmentPagerAdapter文档](视图层次结构在不可见时可能会被破坏),

用户访问的每个页面的片段都将保留在内存中,尽管其视图层次结构可能在不可见时被破坏

离开view可能会从默认布局中重新加载该视图,这就是为什么突出显示状态丢失的原因。

您应该在Fragment保持突出显示状态:

public MyFragment extends Fragment{
    //variable to keep the state
    private boolean highlight;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

        //rest of your other code

        image.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               highliteView.setSelected(!highliteView.isSelected());

               //set the highlight state when clicked
               highlight = !highliteView.isSelected();
           }
        });
        return root;
    }

    //set the view state to the image view
    public void onViewCreated(View view, Bundle savedInstanceState){
        highliteView.setSelected(highlight);
    }
}

暂无
暂无

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

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