TablayoutでviewPagerを使用しようとしましたが、ビューページャーでアダプターを設定すると、エラー「Java.lang.NullPointerException:仮想メソッド 'Java.lang.Class Java.lang.Object.getClass()を呼び出そうとしました」が表示されます。 nullオブジェクト参照」このエラーが表示される理由がわかりません。
ページャーセットアダプタの表示:
viewPager= (ViewPager) findViewById(R.id.viewPager_id);
viewPager.setAdapter(newViewPagerAdapterUseThisClass(getSupportFragmentManager(),14));
アダプターclss:
class ViewPagerAdapterUseThisClass extends FragmentPagerAdapter {
int countTabItem;
ViewPagerAdapterUseThisClass(FragmentManager fm,int contTabItem) {
super(fm);
this.countTabItem=contTabItem;
}
@Override
public Fragment getItem(int position) {
if(position==0){
EnthusamTab enthusamTab=new EnthusamTab();
return enthusamTab;
}
return null;
}
@Override
public int getCount() {
return countTabItem;
}
}
ページャーxmlファイルを表示:
<Android.support.v4.view.ViewPager
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_below="@id/tab_layout_id"
Android:id="@+id/viewPager_id"/>
エラーログ:
Java.lang.NullPointerException: Attempt to invoke virtual method 'Java.lang.Class Java.lang.Object.getClass()' on a null object reference
at Android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.Java:380)
at Android.support.v4.app.BackStackRecord.add(BackStackRecord.Java:375)
at Android.support.v4.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.Java:103)
at Android.support.v4.view.ViewPager.addNewItem(ViewPager.Java:1034)
at Android.support.v4.view.ViewPager.populate(ViewPager.Java:1248)
at Android.support.v4.view.ViewPager.populate(ViewPager.Java:1116)
at Android.support.v4.view.ViewPager.onMeasure(ViewPager.Java:1642)
at Android.view.View.measure(View.Java:19861)
at Android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.Java:715)
at Android.widget.RelativeLayout.onMeasure(RelativeLayout.Java:461)
at Android.view.View.measure(View.Java:19861)
at Android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.Java:1081)
at Android.view.View.measure(View.Java:19861)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:6083)
at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:185)
at Android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.Java:139)
at Android.view.View.measure(View.Java:19861)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:6083)
at Android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.Java:1464)
at Android.widget.LinearLayout.measureVertical(LinearLayout.Java:758)
at Android.widget.LinearLayout.onMeasure(LinearLayout.Java:640)
at Android.view.View.measure(View.Java:19861)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:6083)
at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:185)
at Android.view.View.measure(View.Java:19861)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:6083)
at Android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.Java:1464)
at Android.widget.LinearLayout.measureVertical(LinearLayout.Java:758)
at Android.widget.LinearLayout.onMeasure(LinearLayout.Java:640)
at Android.view.View.measure(View.Java:19861)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:6083)
at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:185)
at com.Android.internal.policy.DecorView.onMeasure(DecorView.Java:689)
at Android.view.View.measure(View.Java:19861)
at Android.view.ViewRootImpl.performMeasure(ViewRootImpl.Java:2275)
at Android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.Java:1366)
at Android.view.ViewRootImpl.performTraversals(ViewRootImpl.Java:1619)
at Android.view.ViewRootImpl.doTraversal(ViewRootImpl.Java:1254)
at Android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.Java:6343)
at Android.view.Choreographer$CallbackRecord.run(Choreographer.Java:874)
at Android.view.Choreographer.doCallbacks(Choreographer.Java:686)
at Android.view.Choreographer.doFrame(Choreographer.Java:621)
at Android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.Java:860)
at Android.os.Handler.handleCallback(Handler.Java:751)
at Android.os.Handler.dispatchMessage(Handler.Java:95)
at Android.os.Looper.loop(Looper.Java:154)
at Android.app.ActivityThread.main(ActivityThread.Java:6126)
at Java.lang.reflect.Method.invoke(Native Method)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:886)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:776)
この例外は、null
のgetItem(int position)
メソッドでPagerAdapter
を返すときに発生します。
getCount()
メソッドで戻り値(n)を設定し、すべての(0 .. n-1)位置に対してgetItem(int position)
メソッドでFragment
を返す必要があります。
たとえば、getCount()
メソッドから3を返す場合、getItem(int position)
メソッドの位置0、1、および2に対して非ヌルFragment
を返す必要があります。位置0、1、または2に対してnullを返すと、次のようになります:
Java.lang.NullPointerException:nullオブジェクト参照で仮想メソッド「Java.lang.Class Java.lang.Object.getClass()」を呼び出そうとしました
private static class MyPagerAdapter extends FragmentPagerAdapter {
...
@Override
public int getCount() {
return 3;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new XFragment();
case 1:
return new YFragment();
case 2:
return new ZFragment();
default:
return null; // Problem occurs at this condition!
}
}
}
このエラーは通常、指定した数よりも少ないフラグメントを返す場合に発生します。たとえば、count = 3を返し、2番目の位置でnullを返します。 countはゼロベースのインデックスであることに注意してください。
すべてのカウントに対して戻ります。これを試して:
Override
public Fragment getItem(int position) {
EnthusamTab enthusamTab=new EnthusamTab();
return enthusamTab;
}
私が見るところによれば、このメソッドでnullを返しています:
@Override
public Fragment getItem(int position) {
if(position==0){
EnthusamTab enthusamTab=new EnthusamTab();
return enthusamTab;
}
return null;
}
このタイプの例外は、メソッドgetCount()
を使用して、タブで初期化するよりも多くの値を返そうとした場合にのみ発生します。戻り値を変更します。
これをgetCount
で実行して、持っているすべてのフラグメントの数を数えます:1..5など
@Override
public int getCount() {
return 5; //her
}
public Fragment getItem(int position) {
if (position == 0) {
Tab1 tab1 = new Tab1();
return tab1;
}
if (position == 2) {
Tab2 tab2 = new Tab2();
return tab2;
} else {
Tab3 tab3 = new Tab3();
return tab3;
}
}
フラグメントカウント関数でnullを返す問題が発生しています
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new XFragment();
case 1:
return new YFragment();
case 2:
return new ZFragment();
default:
return null; // Problem occurs at this condition!
}
}
ここで、外側の括弧はエラーになります。
したがって、上記の回答は正しく、機能しています。
public Fragment getItem(int position) {
if (position == 0) {
Tab1 tab1 = new Tab1();
return tab1;
}
if (position == 2) {
Tab2 tab2 = new Tab2();
return tab2;
} else {
Tab3 tab3 = new Tab3();
return tab3;
}
}
それは正解です。
Breakコマンドの設定を忘れたため、このエラーが発生しました。最初にブレーク演算子を確認してください。
今、私はこのコードを持っています:
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new FollowersFragment();
case 1:
return new PostsFragment();
case 2:
return new ReactsFragment();
case 3:
return new StoriesFragment();
case 4:
return new FollowersFragment();
case 5:
return new FollowersFragment();
case 6:
return new FollowersFragment();
}
return null;
}
以下に示すコードを使用するだけです。nullエラーを回避し、スムーズに実行されます
@Override
public Fragment getItem(int position) {
return new Tab1( );
}