私のアプリに起因する問題ではなく、サポートライブラリ自体にあるように見えるため、バグがどこにあるのかわかりません。
このバグは、Android 2.1 update 1 を搭載した古いデバイスでのみ発生し、場合によっては Android 2.2 froyo でのみ発生することに気付きました。私のデバイスでは、Android 2.3以降はまったく問題ありません。私が持っているどのデバイスでも、この問題を引き起こしている電話と同じ仕様で構成されたエミュレーターでも、この問題を再現できません
問題を特定することなく、私は一日中これを見ていました。
java.lang.NullPointerException
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1366)
at android.view.View.draw(View.java:6743)
at android.support.v4.view.ViewPager.draw(SourceFile:1923)
at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
at android.view.View.draw(View.java:6743)
at android.widget.FrameLayout.draw(FrameLayout.java:352)
at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
at android.view.View.draw(View.java:6743)
at android.widget.FrameLayout.draw(FrameLayout.java:352)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1843)
at android.view.ViewRoot.draw(ViewRoot.java:1407)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1163)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
at dalvik.system.NativeStart.main(Native Method)
そしてメイン アクティビティ onCreate のコード
線形レイアウトのページャーは、ユーザーがどのビューのページャー番号にいるかを示すドットのセットです。Populate pager は、ViewPager getcount()) によって取得されたビューページャーの数に基づいて、下部画面をドットで埋めます。
PageListener は、ビューページャーがいつページを切り替えたかを確認し、対応するドットを別の色でペイントするだけです
pager = (LinearLayout) findViewById(R.id.pager); appViewPager = (ViewPager) findViewById(R.id.AppViewPager); adapter = new MyPagerAdapter(this, appsList); appViewPager.setAdapter(adapter); populatePager(); PageListener pageListener = new PageListener(); appViewPager.setOnPageChangeListener(pageListener);
MyPagerAdapter コード:
public class MyPagerAdapter extends PagerAdapter implements OnCancelListener {
private Context ctx = null;
public ArrayList<App> appsList;
public MyPagerAdapter(Context ctx, ArrayList<App> appsList) {
this.ctx = ctx;
this.appsList = appsList;
}
@Override
public int getCount() {
int listsize = appsList.size();
int numOfAppsPerPage = Integer.valueOf(ctx.getResources().getString(R.string.grid_number_of_apps_per_page));
float num = Float.valueOf(listsize) / Float.valueOf(numOfAppsPerPage);
float rest = num % 1;
int numOfPagers = Math.round(num - rest);
if (rest > 0 || numOfPagers == 0) {
numOfPagers = numOfPagers + 1;
}
return numOfPagers;
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public Object instantiateItem(View collection, int position) {
LayoutInflater inflater = (LayoutInflater) collection.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.grid, null);
GridView gridview = (GridView) view.findViewById(R.id.gridview);
int starterPosition;
int numOfAppsPerPage = Integer.valueOf(ctx.getResources().getString(R.string.grid_number_of_apps_per_page));
starterPosition = numOfAppsPerPage * position;
int enderPosition = starterPosition + numOfAppsPerPage;
// Log.e("ViewPagerPosition", "Position:" + position);
int appsListSize = appsList.size();
if (enderPosition > appsListSize) {
enderPosition = appsListSize;
}
ArrayList<App> shorterList = new ArrayList<App>(appsList.subList(
starterPosition, enderPosition));
final AppLauncherAdapter grid = new AppLauncherAdapter(ctx, shorterList);
gridview.setAdapter(grid);
((ViewPager) collection).addView(gridview, 0);
return gridview;
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView((View) arg2);
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == ((View) arg1);
}
@Override
public Parcelable saveState() {
return null;
}
}
何か案は?