我有一个显示“卡片”的可视寻呼机,用户可以在其中进行刷卡。卡片是在它们自己的片段中创建的(因此我使用FragmentStatePageRadapter创建viewPager的内容)。
我想显示下一张卡片的边缘,也可能是上一张卡片的边缘,所以按照这个网站上的建议,我将viewpager的页边距设置为负数。这个很好用,看起来就像我想要的那样。
我的问题是我需要响应卡上的点击事件。但是使用负页边距会导致页面重叠,有时会导致错误的页面接收到单击事件。如何确保正确的卡接收到单击事件?基本上,我想要的是只有当前/选定的页面将接收单击事件。
从包含viewpager的主片段:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_cards_overview, null);

    mCardsViewPager = (ViewPager) root.findViewById(R.id.cards_viewpager);

    mPagerAdapter = new MyPagerAdapter(getActivity(), getFragmentManager(), mCardsList);
    mCardsViewPager.setAdapter(mPagerAdapter);
    mCardsViewPager.setOnPageChangeListener(mPagerAdapter);

    // Necessary or the pager will only have one extra page to show
    // make this at least however many pages you can see
    mCardsViewPager.setOffscreenPageLimit(3);

    // Set margin for pages as a negative number, so a part of next and
    // previous pages will be showed (convert desired dp to pixels)
    DisplayMetrics m = getResources().getDisplayMetrics();
    int pagerWidthPx = (int) getResources().getDimension(R.dimen.card_width);
    int screenWidthPx = m.widthPixels;
    int px = (int) ((screenWidthPx - pagerWidthPx) * 1.6);
    mCardsViewPager.setPageMargin(-px);

    return root;
}

卡片布局:
<RelativeLayout
    android:id="@+id/card_content"
    android:layout_width="@dimen/card_width"
    android:layout_height="@dimen/card_height"
    android:background="@drawable/card_background" >

    <ImageView
        android:id="@+id/card_logo"
        android:layout_width="50dp"
        android:layout_height="35dp"
        android:layout_margin="8dp"
        android:contentDescription="@string/app_name"
        android:scaleType="fitStart"
        android:src="@drawable/card_logo" />
    <Button
        android:id="@+id/card_remove_button"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_margin="3dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:background="@drawable/btn_close" />

    <TextView
        android:id="@+id/card_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/card_logo"
        android:layout_centerVertical="true"
        android:layout_margin="8dp"
        android:textSize="20sp" />
</RelativeLayout>

XML:
<dimen name="card_width">300dp</dimen>
<dimen name="card_height">200dp</dimen>

最佳答案

我想是我自己解决的。我在pageradapter中实现了以下方法:

@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
    super.setPrimaryItem(container, position, object);
    if(object instanceof CardFragment){
        CardFragment f = (CardFragment) object;
        View v = f.getView();
        if(v != null){
            v.bringToFront();
        }
    }
}

这有助于将当前选定的片段放在其他片段前面。但在创建片段之前,它会被多次调用,因此会进行空检查。不确定这是否有性能问题,但它似乎是完美的

关于android - 在ViewPager中以负页边距处理单击事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17649216/

10-10 04:56