2012-06-19 11 views
7

का उपयोग करते समय एंड्रॉइड ऐप क्रैश हो रहा है, मुझे अपने टुकड़ों को पुनर्स्थापित करने का प्रयास करते समय मेरे एंड्रॉइड ऐप क्रैशिंग में समस्या आई है। मैंने उस बंडल में कोई कस्टम वैरिएबल नहीं जोड़ा है जिसे मैं पुनर्स्थापित करने का प्रयास कर रहा हूं, यह सब डिफ़ॉल्ट है। मैं टुकड़े और ViewPager का उपयोग कर रहा हूँ। नीचे मेरी कोड के टुकड़े देखें:फ्रैगमेंट्स और व्यूपेजर

public static class MyAdapter extends FragmentStatePagerAdapter { 
    public MyAdapter(FragmentManager fm) { 
     super(fm); 
    } 

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

    public int getCurrentItemPosition(Fragment fragment){ 
     return getItemPosition(fragment); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return ContentFragment.newInstance(position); 
    } 
} 

public class MyActivity extends FragmentActivity { 

static final int NUM_ITEMS = 100000; 
public int currentSelectedPage; 
private int changeToFragmentIndex; 
public DateTime midDate; 
MyAdapter mAdapter; 
ViewPager mPager; 

/** Called when the activity is first created. */ 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.diary); 
    MyApplication application = (MyApplication)getApplication(); 
    application.dataController.myActivity = this; 
    mAdapter = new MyAdapter(getSupportFragmentManager()); 
    mPager = (ViewPager)findViewById(R.id.pager); 
    mPager.setAdapter(mAdapter); 
    int newDay = application.daysBetween(DateTime.now(), DateTime.parse(application.day.dateToShortString())); 

    this.currentSelectedPage = NUM_ITEMS/2+newDay; 
    mPager.setCurrentItem(NUM_ITEMS/2+newDay); 
    mPager.setOnPageChangeListener(new SimpleOnPageChangeListener(){ 
     public void onPageSelected(int position){ 
      currentSelectedPage = position; 
      ContentFragment fragment = (ContentFragment) mAdapter.instantiateItem(mPager, currentSelectedPage); 
      fragment.loadData(); 
     } 
    }); 
} 

} 

public class ContentFragment extends Fragment { 
private View v; 
static final int NUM_ITEMS = 100000; 

static ContentFragment newInstance(int num) { 
    ContentFragment f = new ContentFragment(); 

    return f; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    if (container == null) 
     return null; 
    v = inflater.inflate(R.layout.diarycontent, container, false); 
    return v; 
} 

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

} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState){ 
    super.onSaveInstanceState(savedInstanceState); 
    setUserVisibleHint(true); 
} 
} 

मैं इस stackstrace प्राप्त करते हैं:

Caused by: java.lang.NullPointerException 
at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:519) 
at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:1 55) 
at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:522) 

जैसा कि मैंने समझ लिया है इस सहायता पैकेज और कहा कि एक संभव समाधान के साथ एक ज्ञात समस्या हो सकती है setUserVisibleHint उपयोग करने के लिए होगा (सच) onSaveInstanceState में। लेकिन इससे मदद नहीं मिली।

क्या किसी को समस्या का एक और समाधान पता है या मैंने क्या गलत किया है?

+0

हाय @xteci आप इस मुद्दे को हल है? मुझे इस तरह की त्रुटि भी मिलती है, और अभी भी समाधान – hakim

+0

मुझे भी नहीं मिला है, क्या आपको कुछ भी मिला है? @hakim – henrikpersson

+0

आप इस उत्तर का उपयोग कर सकते हैं यह मेरे लिए काम करता है http://stackoverflow.com/questions/18642890/fragmentstatepageradapter-with-childfragmentmanager-fragmentmanagerimpl-getfra –

उत्तर

-1

तुम क्यों वास्तव में कर रहे हैं:

mPager.setOnPageChangeListener(new SimpleOnPageChangeListener(){ 
    public void onPageSelected(int position){ 
     currentSelectedPage = position; 
     ContentFragment fragment = (ContentFragment) mAdapter.instantiateItem(mPager, currentSelectedPage); 
     fragment.loadData(); 
    } 
}); 

यह:

@Override 
public Fragment getItem(int position) { 
    return ContentFragment.newInstance(position); 
} 

टुकड़ा को दर्शाता है।

आप टुकड़ा में इस तरह डेटा लोड कर सकते हैं:

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
super.onActivityCreated(savedInstanceState); 
loadData(); 
} 
+0

मैं ऐसा कर रहा था क्योंकि मुझे अपने टुकड़े सही तरीके से अपडेट करने में कुछ परेशानी थी । मैंने आपके कोड का परीक्षण किया और दुर्घटना अभी भी हुई। – xteci

+0

क्या आप इसे हल करने में सक्षम थे? मैं इस मुद्दे के साथ अटक गया हूं – Preethi

+0

यह मेरे लिए हल हो गया है, या इसे वास्तव में छुपाया है http://stackoverflow.com/questions/18642890/fragmentstatepageradapter-with-childfragmentmanager-fragmentmanagerimpl-getfra –

20

मैं इस मुद्दे के एक ही प्रकार सामना करना पड़ा है एक बार मैं टैब के अंदर FragmentStatePagerAdapter साथ ViewPager उपयोग शुरू कर दिया।

फिर मैंने इस मुद्दे से संबंधित सभी मंचों के साथ खेला और यह पता लगाने के लिए कि यह समस्या क्यों हुई है और इसे कैसे हल किया जाए, लेकिन मेरे आवश्यकता को पूरा करने के लिए कोई सही समाधान नहीं मिला है, लेकिन मुझे दो दिनों तक अपना सिर तोड़ दिया।

मुझे फ्रैगमेंटस्टेट पेजर एडाप्टर के बजाय एनपीई क्रैश उपयोग FragmentPagerAdapter से बचने के लिए समाधान मिला। जब मैं FragmentStatePagerAdapter के बजाय FragmentPagerAdapter को प्रतिस्थापित करता हूं तो एनपीई क्रैश समस्या का सामना नहीं किया जाता है, लेकिन उसी पृष्ठ को आगे नेविगेशन (जो मेरी आवश्यकता है) के लिए खुद को रीफ्रेश नहीं किया जाता है।

अंत में FragmentStatePagerAdapter पर saveState विधि को ओवरराइड करें और अपेक्षित रूप से ठीक से काम कर रहे सब कुछ ओवरराइड करें।

@Override 
public Parcelable saveState() { 
    // Do Nothing 
    return null; 
} 


मैं कैसे इस समस्या को आसानी से पुन: पेश:
मैं उच्च संस्करण (4.1) उपकरण का उपयोग कर रहा हूँ और नीचे दिए गए चरणों का पालन किया:
1. सेटिंग में जाएं -> डेवलपर विकल्प।
2. "गतिविधियां न रखें" विकल्प पर क्लिक करें।

अब मैं अपने ऐप के साथ खेला।

एंड्रॉइड.support.v4.app.FragmentManagerImpl.getFragment (अज्ञात स्रोत) पर एनपीई के कारण प्रत्येक बार ऐप क्रैश होने से पहले saveState() विधि को ओवरराइड करने से पहले। लेकिन ओवरराइड saveState() कोई क्रैश पंजीकृत नहीं है।

मुझे आशा है कि ऐसा करने से आपको कोई समस्या नहीं होगी।

+0

इसके लिए धन्यवाद! –

+4

यह काम करता है! क्या किसी को पता है क्यों? – Archit

+0

बहुत धन्यवाद! यह पूरी तरह से काम करता है –

0

मैंने शुरुआत में @ ललित कुमार साहू द्वारा सुझाए गए समाधान का उपयोग किया था।हालांकि, मैंने एक गंभीर मुद्दा देखा: हर बार जब मैंने डिवाइस को घुमाया, फ्रैगमेंट मैनेजर ने पुराने टुकड़े को हटाए बिना नए टुकड़े जोड़े। इसलिए मैंने आगे की खोज की और मुझे एक वर्कअराउंड सुझाव (post #1) के साथ एक बग रिपोर्ट मिली। मैं इसे ठीक किया जाता है और मेरे ऐप्स के साथ परीक्षण किया है, इस मुद्दे को किसी भी दुष्प्रभाव के बिना हल किया जाना प्रतीत होता है:

वर्कअराउंड:/v4/एप्लिकेशन फ़ोल्डर परियोजना की src/एंड्रॉयड/समर्थन में कस्टम FragmentStatePagerAdapter बनाएँ और इसका इस्तेमाल करते हैं ।

package android.support.v4.app; 

import android.os.Bundle; 
import android.view.ViewGroup; 

public abstract class FixedFragmentStatePagerAdapter extends FragmentStatePagerAdapter { 

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

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
    Fragment f = (Fragment)super.instantiateItem(container, position); 
    Bundle savedFragmentState = f.mSavedFragmentState; 
    if (savedFragmentState != null) { 
     savedFragmentState.setClassLoader(f.getClass().getClassLoader()); 
    } 
    return f; 
    } 
} 
+1

लेकिन "mSavedFragmentState" उपलब्ध नहीं है ... –