android.support.v4.view.ViewPager cannot be cast to com.custom.NoScrollViewPager 솔루션
9607 단어 Android
웹 주소는 다음과 같습니다.https://blog.csdn.net/yilei0033/article/details/79444099
간단하게 말하면, 계승 ViewPager의 클래스를 사용자 정의합니다. NoScroll ViewPager, onInterceptTouch Event (Motion Event 이벤트) 를 다시 쓰고 setNoScroll (boolean noScroll) 방법을 추가했습니다.런타임 시 다음과 같은 예외가 발생했습니다.
01-20 11:12:12.890: E/AndroidRuntime(32097): Caused by: java.lang.ClassCastException: android.support.v4.view.ViewPager cannot be cast to com.example.library.NoScrollViewPager
이 이상은 제가 앱을 하나 썼을 때 만났던 기억이 납니다. 이번에는 또 한동안 괴로웠습니다. 이에 글을 써서 자신을 일깨워 주었습니다.
먼저 내 프로젝트의 코드를 첨부합니다.
우선, 사용자 정의 NoScroll ViewPager로 android를 계승했습니다.support.v4.view.ViewPager .
NoScrollViewPager.java
public class NoScrollViewPager extends android.support.v4.view.ViewPager {
private boolean isCanScroll = false;
public NoScrollViewPager(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public NoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setScanScroll(boolean isCanScroll) {
this.isCanScroll = isCanScroll;
}
@Override
public void scrollTo(int x, int y) {
super.scrollTo(x, y);
}
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent arg0) {
// TODO Auto-generated method stub
if (isCanScroll) {
return super.onTouchEvent(arg0);
} else {
return false;
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
// TODO Auto-generated method stub
if (isCanScroll) {
return super.onInterceptTouchEvent(arg0);
} else {
return false;
}
}
@Override
public void setCurrentItem(int item, boolean smoothScroll) {
// TODO Auto-generated method stub
super.setCurrentItem(item, smoothScroll);
}
@Override
public void setCurrentItem(int item) {
// TODO Auto-generated method stub
super.setCurrentItem(item, false);
}
}
다음은 제가 사용자 정의한 ViewPagerFragment입니다. 구조 함수에서layout의 id를 매개 변수로 레이아웃 파일을 연결하여 코드를 복원합니다.
여기서 mViewPager는 android입니다.support.v4.view.ViewPager 유형입니다.
SingleViewPagerFragment.java
public class SingleViewPagerFragment extends Fragment {
// TabLayout
protected TabLayout mTabLayout;
// ViewPager
protected ViewPager mViewPager;
// Title
protected List mTitle;
// Fragment
protected List mFragment;
// View
protected View view;
private int layout;
public SingleViewPagerFragment(int layout) {
// TODO Auto-generated constructor stub
this.layout = layout;
}
public SingleViewPagerFragment() {
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// this.requestWindowFeature(Window.FEATURE_NO_TITLE);//
}
/*
*
*/
@SuppressLint("InflateParams")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// TODO Auto-generated method stub
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) {
parent.removeView(view);
}
return view;
}
view = inflater.inflate(layout, null);
initData();
initView(view);
return view;
}
protected void initData() {
mTitle = new ArrayList();
mFragment = new ArrayList();
// DatabaseQuery.CollegeMkdirs();//
}
/*
* view
*/
protected void initView(View v) {
}
}
다음은 layout 파일입니다.
마지막으로 구체적인 ViewPager는 내가 정의한 Single ViewPager Fragment를 계승하고 initView에서 다음 코드를 사용합니다.
mViewPager = (NoScrollViewPager) v.findViewById(R.id.main_ViewPager);
NoScroolViewPager를 가져옵니다.그 결과 제목에 서술한 이상이 나타났다.
//MainViewPagerFragment.java
public class MainViewPagerFragment extends SingleViewPagerFragment {
public MainViewPagerFragment(int layout) {
super(layout);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
public MainViewPagerFragment() {
// TODO Auto-generated constructor stub
}
protected void initData() {
super.initData();
mTitle.add(" ");
mTitle.add(" ");
mTitle.add(" ");
mFragment.add(new DeliverFragment());
mFragment.add(new ReceiveFragment());
mFragment.add(new UserFragment());
// DatabaseQuery.CollegeMkdirs();//
}
@Override
protected void initView(View v) {
// TODO Auto-generated method stub
mTabLayout = (TabLayout) v.findViewById(R.id.main_TabLayout);
mViewPager = (NoScrollViewPager) v.findViewById(R.id.main_ViewPager);
super.initView(v);
//
MainPagerAdapter myFragmentPagerAdapter = new MainPagerAdapter(getActivity().getSupportFragmentManager(),
mFragment, mTitle, this.getActivity());
mViewPager.setAdapter(myFragmentPagerAdapter);
mViewPager.setOffscreenPageLimit(mTabLayout.getTabCount());
// mViewPager
mViewPager.addOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
mTabLayout.getTabAt(arg0).select();
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
mTabLayout.setupWithViewPager(mViewPager);
for (int i = 0; i < mTabLayout.getTabCount(); i++) {
mTabLayout.getTabAt(i).setCustomView(myFragmentPagerAdapter.getTabView(i));
}
mTabLayout.setSelectedTabIndicatorColor(Color.WHITE);
// this.reflex(mTabLayout);
mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@SuppressWarnings("deprecation")
@Override
public void onTabUnselected(Tab tab) {
// TODO Auto-generated method stub
switch (tab.getPosition()) {
case 0:
tab.getCustomView().findViewById(R.id.item_text).setBackgroundResource(R.drawable.empty_tab);
break;
case 1:
tab.getCustomView().findViewById(R.id.item_text).setBackgroundResource(R.drawable.empty_tab);
break;
case 2:
tab.getCustomView().findViewById(R.id.item_text).setBackgroundResource(R.drawable.empty_tab);
break;
}
TextView textView = (TextView) tab.getCustomView().findViewById(R.id.item_text);
textView.setTextColor(getResources().getColor(R.color.colorAccent));
}
@SuppressWarnings("deprecation")
@Override
public void onTabSelected(Tab tab) {
// TODO Auto-generated method stub
switch (tab.getPosition()) {
case 0:
tab.getCustomView().findViewById(R.id.item_text).setBackgroundResource(R.drawable.tab0);
break;
case 1:
tab.getCustomView().findViewById(R.id.item_text).setBackgroundResource(R.drawable.tab1);
break;
case 2:
tab.getCustomView().findViewById(R.id.item_text).setBackgroundResource(R.drawable.tab2);
break;
}
TextView textView = (TextView) tab.getCustomView().findViewById(R.id.item_text);
textView.setTextColor(getResources().getColor(R.color.colorSelected));
mViewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabReselected(Tab arg0) {
// TODO Auto-generated method stub
}
});
mViewPager.setCurrentItem(0);
mTabLayout.getTabAt(0).select();
}
}
이상을 일으킨 원인은 내가 Fragment에서 NoScrool ViewPager를 얻었을 때만 강제로 전환했을 뿐,layout에서android를 사용하지 않았기 때문이다.support.v4.view.ViewPager가 사용자 정의 NoScrollViewPager로 바뀌었습니다. 올바른 layout 파일은 다음과 같습니다.
지혜롭지 못한 잘못...더 이상 괴롭히고 싶지 않아!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.