2016-05-31 18 views
1

私は本当にクレイジーな問題があります。カスタムViewPagerでcanScrollが呼び出されない

私のカスタムViewPagercanScroll(View v, boolean checkV, int dx, int x, int y)メソッドをオーバーライドしてスクロールしないようにしたいと思います。

ProductsFragmentを使用すると非常にうまく動作します。たとえそれが同じで複数回使用されたとしても、それは完全に動作しますViewPager

別のフラグメントを使用すると、問題が発生しましたcanScrollは、その特定のフラグメントでトリガーしません。 しかし、私は私のアプリで異なるフラグメントをしたい:D

ViewPager:

public class LockableViewPager extends ViewPager { 

public LockableViewPager(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 


@Override 
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { 
    Log.i("tag","id: "+getContext().getResources().getResourceEntryName(v.getId())); 

    return super.canScroll(v, checkV, dx, x, y); 
} 

アダプタ:

public class AppointmentPagerAdapter extends FragmentPagerAdapter { 

public AppointmentPagerAdapter(FragmentManager fm) { 
    super(fm); 
} 

@Override 
public Fragment getItem(int position) { 
    switch (position) { 
     case 2: 
      return new ProductsFragment(); //this works 
     case 3: 
      return new ProductsFragment(); //this works 
     case 1: 
      return new InfoFragment(); //this works Not 
     case 0: 
      return new ScheduleFragment(); //this works Not 
     default: 
      return null; 
    } 
} 

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

@Override 
public CharSequence getPageTitle(int position) { 
    return null; 
} 

ProductsFragment:

public class ProductsFragment extends Fragment { 

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

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

    View rootView= inflater.inflate(R.layout.fragment_products, container, false); 


    ProductsRecycleAdapter adapter=new ProductsRecycleAdapter(getDummyData(), new ProductsRecycleAdapter.ClickHandler() { 
     @Override 
     public void addToCart(int position) { 
      Log.i("log","addToCart: "+position); 
     } 

     @Override 
     public void clicked(int position) { 
      Log.i("log","clicked: "+position); 
     } 
    }); 

    RecyclerView recyclerView= (RecyclerView) rootView.findViewById(R.id.frag_products_recycle); 
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 
    recyclerView.setAdapter(adapter); 

    return rootView; 
} 


@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 

} 

ScheduleFragment:

public class ScheduleFragment extends Fragment { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

} 

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

    View rootView=inflater.inflate(R.layout.fragment_schedule, container, false); 


    return rootView; 
} 


@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 

} 

}

LogCatの出力は、たとえば次のようになります。

tag: id: act_appointment_pager 
    tag: id: fragment_products 
    tag: id: frag_products_recycle 
    tag: id: act_appointment_pager 
    tag: id: fragment_products 
    tag: id: frag_products_recycle 
    tag: id: act_appointment_pager 
    tag: id: fragment_products 
    tag: id: frag_products_recycle 

しかし、私はProductsFragment以外のフラグメントのための出力を得ることはありません。

はい、ビューにはIDがあります。

はその奇妙ではないですか?^^

私はあなたが正しい方向に私を指すことができると思います。

編集: 私はエントリポイントを忘れてしまった...

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_appointment); 

    setupToolbar(); 

    AppointmentPagerAdapter adapter=new AppointmentPagerAdapter(getSupportFragmentManager()); 
    LockableViewPager pager= (LockableViewPager) findViewById(R.id.act_appointment_pager); 
    pager.setAdapter(adapter); 

} 

答えて

1

は最後に、私はそれを考え出した、多分誰かがどのように知りたがっています。

設定が正しいです。 フラグメントにスクロールしているコンテンツがない場合、メソッドcanScroll(View v, boolean checkV, int dx, int x, int y)はトリガーされません。

いくつかのスクロールコンテンツを追加しました。

しかし、フラグメントにスコーリングコンテンツとスクロールしていないコンテンツがある場合、このメソッドはスクロールするコンテンツに対してのみトリガします。

スクロールしていないコンテンツでスワイプすると、そのメソッドは単に無視されるようです。

さらに、レイアウトの各ビューにIDを割り当てる必要があります。

ここに書かれていることは文書化されていないと思いますが、これについて間違っていると私を修正してください。

関連する問題