1

FragmentPagerAdapterを使用してViewPgaerに4つのフラグメントがあります。私は一定の遅れの後に各断片を追加して、ボトムバータブを切り替えながらジャークフリーのアニメーションを作成しようとします。getChildFragmentManager()。beginTransaction()を使用しているときのヌルオブジェクトリファレンス

シフトアニメーションを持つボトムバーにはthisライブラリを使用します。 4つのフラグメントには複数のAPIコールがあり、遅延の後にこれらを追加しないと、シフトアニメーションは不規則です。

問題は、複製が難しいエラーログ(以下に掲載)が表示されることです。

エラーログ:

Fatal Exception: 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:369) 
    at com.vanitee.services.view.FragmentFake$1.run(FragmentFake.java:46) 
    at android.os.Handler.handleCallback(Handler.java:761) 
    at android.os.Handler.dispatchMessage(Handler.java:98) 
    at android.os.Looper.loop(Looper.java:156) 
    at android.app.ActivityThread.main(ActivityThread.java:6585) 
    at java.lang.reflect.Method.invoke(Method.java) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:941) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:831) 

ViewPagerAdapterClass:

class MyAccountPagerAdapter extends FragmentPagerAdapter { 

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

    @Override 
    public Fragment getItem(int position) { 
     if (position == ME_TAB) { 
      if (Utility.isEmpty(fragmentProfile)) { 
       fragmentProfile = FragmentFake.create(new FragmentUserProfile(), 50); 
      } 
      return fragmentProfile; 
     } else if (position == BOOKINGS_TAB) { 
      if (Utility.isEmpty(fragmentBooking)) { 
       fragmentBooking = FragmentFake.create(new FragmentBookings(), 100); 
      } 
      return fragmentBooking; 
     } else if (position == WALLET_TAB) { 
      if (Utility.isEmpty(fragmentWallet)) { 
       fragmentWallet = FragmentFake.create(new FragmentWallet(), 150); 
      } 
      return fragmentWallet; 
     } else if (position == LIKES_TAB) { 
      if (Utility.isEmpty(fragmentLikes)) { 
       fragmentLikes = FragmentFake.create(new FragmentLikes(), 200); 
      } 
      return fragmentLikes; 
     } 
     return null; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     switch (position) { 
      case ME_TAB: 
       return getContext().getString(R.string.me_tab); 
      case BOOKINGS_TAB: 
       return getContext().getString(R.string.bookings_tab); 
      case WALLET_TAB: 
       return getContext().getString(R.string.wallet_tab); 
      case LIKES_TAB: 
       return getContext().getString(R.string.likes_tab); 
      default: 
       return null; 
     } 
    } 

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

FragmentFake:

public class FragmentFake extends Fragment { 

private View root; 
Fragment fragment; 

public static Fragment create(Fragment frag, int timeMs) { 
    FragmentFake fragmentFake = new FragmentFake(); 
    Bundle bundle = new Bundle(); 
    fragmentFake.fragment = frag; 
    bundle.putInt("time", timeMs); 
    fragmentFake.setArguments(bundle); 
    return fragmentFake; 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    root = inflater.inflate(R.layout.layout_fake_fragment, container, false); 
    Bundle bundle = getArguments(); 
    replaceFragment(bundle.getInt("time")); 
    return root; 
} 

private void replaceFragment(int time) { 
    root.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      if(!isAdded()){ 
       return; 
      } 
      getChildFragmentManager().beginTransaction().add(R.id.replace_fragment_container, fragment).commit(); 
     } 
    }, time); 
} 

}

報告されたエラーログあなたがこの

public static Fragment create(Fragment frag, int timeMs) { 
    FragmentFake fragmentFake = new FragmentFake(); 
    Bundle bundle = new Bundle(); 
    //remove this line, it won't work 
    fragmentFake.fragment = frag; 
    bundle.putInt("time", timeMs); 
    fragmentFake.setArguments(bundle); 
    return fragmentFake; 
} 

を行うことはできません

 getChildFragmentManager().beginTransaction().add(R.id.replace_fragment_container, fragment).commit(); 
+1

beginTransation()の前に、あなたのgetactivity()!= nullをフラグメントでチェックしてください。 –

+0

あなたは救い主です!しかし、問題はアクティビティがnullであったためではなく、トランザクションにnullフラグメントを追加していました!とにかく私の時間を保存しました –

答えて

1

がフラグメントを拡張する1つの抽象フラグメントを作成し、フラグメントトランザクションを作る次に

このような
public static Fragment create(Fragment frag, int timeMs) { 
    FragmentFake fragmentFake = new FragmentFake(); 
    Bundle bundle = new Bundle(); 
    bundle.putInt("time", timeMs); 
    fragmentFake.setArguments(bundle); 
    return fragmentFake; 
} 

public void setFragment(Fragment fragment){ 
    this.fragment = fragment; 
} 

//How you assign fragment 
FragmentFake fakeFragment = FragmentFake.create(0); 
fakeFragment.setFragment(yourFragment); 

でなければなりません。すべてのChildFragmentがあなたのアダプタのBaseChildFragment(FragmentUserProfile、FragmentUserLike、FragmentUserWellet、ETC)、
を拡張し、この

public abstract BaseChildFragment extends Fragment{ 
    public void onViewPagerPagechange(); 

}

メイクのようなコードの下に追加します。これはあなたのChildFragment onViewPagerPagechange();メソッドを呼び出します。この

viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 

// optional 
@Override 
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } 

// optional 
@Override 
public void onPageSelected(int position) { 
BaseChildFragment fragment = adapter.getBaseChildFragment(position); 
fragmeng.onViewPagerPagechange(); 
} 
    // optional 
    @Override 
    public void onPageScrollStateChanged(int state) { } 

}); 

のように表示ポケベルAddpageChangeListenerを持ってあなたのフラグメント上に

LruCache<Integer,BaseChildFragment> cache = new LruCache<>(4); 
public BaseChildFragment getBaseChildFragment(int position){ 
    return cache.get(position); 
} 

@Override 
public Fragment getItem(int position) { 
    if (position == ME_TAB) { 
     if (Utility.isEmpty(fragmentProfile)) { 
      fragmentProfile = FragmentFake.create(new FragmentUserProfile(), 50); 
      cache.put(position,fragmentProfile); 
     } 
     return fragmentProfile; 
    } else if (position == BOOKINGS_TAB) { 
     if (Utility.isEmpty(fragmentBooking)) { 
      fragmentBooking = FragmentFake.create(new FragmentBookings(), 100); 
cache.put(position,fragmentBooking); 
     } 
     return fragmentBooking; 
    } else if (position == WALLET_TAB) { 
     if (Utility.isEmpty(fragmentWallet)) { 
      fragmentWallet = FragmentFake.create(new FragmentWallet(), 150); 
      cache.put(position,fragmentWallet); 
     } 
     return fragmentWallet; 
    } else if (position == LIKES_TAB) { 
     if (Utility.isEmpty(fragmentLikes)) { 
      fragmentLikes = FragmentFake.create(new FragmentLikes(), 200); 
      cache.put(position,fragmentLikes); 
     } 
     return fragmentLikes; 
    } 
    return null; 
} 

。子フラグメントをロードすることができます。

0

ラインであるあなたは、create文からその割り当て行を削除し、そのフラグメントを割り当てるための別の方法を追加することができますインスタンスが作成された後あなたのコードは

+0

しかし、フラグメントを割り当てる前にインスタンスが作成されました。どのように問題を解決したのか教えていただけますか?この問題は頻繁に発生するものではなく、複製する方法はわかりません。 –

関連する問題