2016-03-02 9 views
14

Çocukken iki parçacığı olan bir ViewPager parçasını kullanıyorum. Bu aşağıdaki NullPointerException ile benim uygulama çöker diğer fragmanın tarafından ViewPager fragmanının yerini ve ViewPager fragmanı bu parçayı değiştirmek ancak zaman, büyük çalışır:NullPointerException bir ViewPager'ı ikinci kez gösterdiğinde

Benim ViewPager parçası iki çocuğu instanciating aşağıdaki kaynak koddan oluşan
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference 
    at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:667) 
    at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:211) 
    at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1319) 
    at android.view.View.dispatchRestoreInstanceState(View.java:13756) 
    at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2888) 
    at android.view.View.restoreHierarchyState(View.java:13734) 
    at android.support.v4.app.Fragment.restoreViewState(Fragment.java:468) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1094) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) 
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) 
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) 
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5294) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 

Parçalar boş oldukları takdirde. Ayrıca, ViewPagerAdapter uygulaması, instanciated ve ViewPager için atanır.

public class ConnectionPasswordViewPagerFragment extends Fragment 
{ 
    private ViewPager vpConnectionPassword; 
    private ConnectionPasswordViewPagerAdapter paConnectionPassword; 
    private ConnectionPasswordGeneratorMACAddress passwordGeneratorMACAddress; 
    private ConnectionPasswordGeneratorSerialNumber passwordGeneratorSerialNumber; 

    public ConnectionPasswordViewPagerFragment() 
    { 
    // Required empty public constructor 
    } 

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

    if ((this.passwordGeneratorSerialNumber == null) && (this.passwordGeneratorMACAddress == null)) 
    { 
     this.passwordGeneratorMACAddress = new ConnectionPasswordGeneratorMACAddress(); 
     this.passwordGeneratorSerialNumber = new ConnectionPasswordGeneratorSerialNumber(); 
    } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) 
    { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragment_connection_password_view_pager, container, false); 
    } 

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

    /*if (this.paConnectionPassword == null) 
    {*/ 
     this.paConnectionPassword = new ConnectionPasswordViewPagerAdapter(this.getChildFragmentManager(), this.getActivity(), this.passwordGeneratorMACAddress, this.passwordGeneratorSerialNumber); 
    //} 
    this.vpConnectionPassword = (ViewPager) this.getActivity().findViewById(R.id.vpConnectionPassword); 
    this.vpConnectionPassword.setAdapter(this.paConnectionPassword); 
    } 
} 

uygulama aşağıda gösterilen ViewPagerAdapter

bir ArrayList çocuk fragmanları referans tutar ve Yöntem getItem(), getCount() olarak getPageTitle() uygular. ViewPagerFragment sınıfı, Fragment desteğini genişletir ve çocuk parçaları tarafından uygulanan soyut yöntem getPageTitleStringID() sağlar.

public class ConnectionPasswordViewPagerAdapter extends FragmentStatePagerAdapter 
{ 
    private static final byte NUMBER_OF_FRAGMENTS = (byte) 2; 

    private ArrayList<ViewPagerFragment> childFragments; 
    private Activity displayActivity; 

    public ConnectionPasswordViewPagerAdapter(FragmentManager fragmentMgm, Activity displayAct, ConnectionPasswordGeneratorMACAddress generatorMACAddress, ConnectionPasswordGeneratorSerialNumber generatorSerialNumber) 
    { 
    super(fragmentMgm); 

    this.childFragments = new ArrayList<>(ConnectionPasswordViewPagerAdapter.NUMBER_OF_FRAGMENTS); 
    this.setDisplayActivity(displayAct); 
    if (generatorMACAddress != null) 
    { 
     this.childFragments.add(generatorMACAddress); 
    } 
    if (generatorSerialNumber != null) 
    { 
     this.childFragments.add(generatorSerialNumber); 
    } 
    } 

    public Activity getDisplayActivity() 
    { 
    return this.displayActivity; 
    } 

    public void setDisplayActivity(Activity value) 
    { 
    this.displayActivity = value; 
    } 

    @Override 
    public Fragment getItem(int position) 
    { 
    return this.childFragments.get(position); 
    } 

    @Override 
    public int getCount() 
    { 
    return ConnectionPasswordViewPagerAdapter.NUMBER_OF_FRAGMENTS; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) 
    { 
    return this.getDisplayActivity().getString(this.childFragments.get(position).getPageTitleStringID()); 
    } 
} 

Yardımlarınız için teşekkürler!

+0

Bunu nasıl çözmek mi? – rupinderjeet

cevap

6

(i ana parçasını korumak çalıştığınızda ben de bu hatayı var) doğruya ayarlanmış Destek parçacığı yöneticisinin replace yöntemini her aradığımda çağrı cihazını görüntüleyin.

public void onSwitchToConnectionPasswordGenerator(View clickedView) 
{ 
    this.fragConnectionPassword = new ConnectionPasswordViewPagerFragment(); 
    this.getSupportFragmentManager().beginTransaction().replace(R.id.flFragmentContainer, this.fragConnectionPassword).commitAllowingStateLoss(); 
} 
+0

Bir arkadaşının hesabını kullanıyorum, fakat soruma bir bakabilir misin? Tam ya da az durumdayım. http://stackoverflow.com/questions/42213051/no-indication-as-to-where-npe-could-occur?noredirect=1#comment71590739_42213051 – jlively

2

Ben senin Viewpager Fragment olduğunu düşünüyorum ve bu parça setRetainInstance ben sadece içeren fragmanın oluşturarak sorunu giderilmiştir

+0

Teşekkürler! Sanırım "setRetainInstance (false)" diye çağırmam gerektiğini kastediyorsunuz. Bu yöntem çağrısını nereden yapmalıyım? – Lukas

0

Daha iyi bir yol olmadığını Fragment almak FragmentManager kontrol edebilirsiniz size onun orada, aşağıdaki gibi sonra yeni bir örneğini oluşturmak değilse:

FragmentManager manager = getSupportFragmentManager(); 
Fragment fragment = manager.findFragmentByTag("YourFragmentName"); 

if(fragment == null) 
    fragment = new YourFragment(); 

FragmentTransaction fragmentTransaction = manager.beginTransaction(); 
fragmentTransaction.replace(Your_Fragmnet_Container_Layout_id, fragment, fragment.getClass().getSimpleName()); 
fragmentTransaction.commit;