2013-07-15 54 views
2

enter image description here處理click事件負頁邊距

我有一個ViewPager顯示「卡」,用戶可以刷卡之間。卡片是在自己的片段中創建的(所以我使用FragmentStatePagerAdapter爲ViewPager創建內容)。

我想顯示下一張和可能以前的卡片的邊緣,因此在本網站上推薦我將ViewPager的pageMargin設置爲負數。這工作得很好,看起來就像我想要的一樣。

我的問題是,我需要響應單擊卡上的事件。但是使用否定頁面邊距會導致頁面重疊,有時會導致錯誤的頁面接收到單擊事件。我如何確保點擊事件是由正確的卡片接收的?基本上我想要的是隻有當前/選定的頁面會收到點擊事件。

從包含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> 

dimens.xml:

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

回答

5

我想我這解決了我自己。我在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(); 
     } 
    } 
} 

這有助於把當前選擇的片段在別人面前。但是在碎片創建之前它會被調用很多,因此會進行空值檢查。不確定是否有任何性能問題,但它似乎是完美的