2013-02-25 53 views
5

सबसे पहले, मुझे पता है कि इन विषयों को स्टैक ओवरफ्लो पर बहुत समय बनाया गया है, लेकिन मुझे मेरी समस्याओं का समाधान नहीं मिला है । दूसरा, मैं फ्रेंच हूं, इसलिए मेरी अंग्रेजी सही नहीं है, प्रतिदिन खेद है और मुझे बताओ कि क्या आप कुछ समझ नहीं पाएंगे। और इस परिचय को पूरा करने के लिए, यह पहली बार है कि मैं टुकड़ों से निपट रहा हूं, इसलिए, क्षमा करें अगर ऐसा कुछ है जिसे मैं अच्छी तरह समझ नहीं पा रहा हूं!टुकड़े से निपटना और पेजर देखना: निष्पादन के लिए खंड और रिकर्सिव एंट्री का टैग नहीं बदला जा सकता है ट्रांसपोर्टिंग

मेरे पास तीन बटन हैं, जो तीन टुकड़ों के बीच स्विच करने की अनुमति देते हैं। इन टुकड़ों में से एक के अंदर, मेरे पास दो टुकड़ों के साथ एक दृश्य पेजर है। इस पल के लिए, प्रत्येक टुकड़े (5 होते हैं), केवल एक टेक्स्ट व्यू होता है। मैं एंड्रॉइड-सपोर्ट-वी 4 के नवीनतम संस्करण का उपयोग कर रहा हूं (मैंने स्टैक ओवरफ्लो में बहुत सी विषय पढ़ा है जो कहता है कि समर्थन का नवीनतम संस्करण "मेरे पास निष्पादित करने के लिए रिकर्सिव एंट्री" को हल करता है)।

मेरे दो समस्याओं:

  • जब मैं एक बटन में दो बार क्लिक करें, मैं एक IllegaleStateException "टुकड़ा के टैग को बदल नहीं सकते" है। मैं बटन पर चयन पर एक नया टुकड़ा बनाकर इसे ठीक करने में सक्षम था, लेकिन मैं स्मृति कारणों और कार्यात्मक कारणों से हर बार खंड को फिर से बनाना नहीं चाहता हूं: खंड को उसके राज्य को रखना है। यह समस्या मेरी मुख्य समस्या नहीं है, वास्तव में, मुझे पता है कि जब उपयोगकर्ता पहले से ही खंड पर है, तो बटन को अक्षम करना संभव है, लेकिन यह प्रबंधन अजीब होना अजीब है जब यह प्रबंधन नहीं किया जाता है, नहीं?

  • जब मैं व्यू पेजर के साथ टुकड़े से बाहर जाता हूं, और मैं इस खंड में वापस जाता हूं, तो मेरे पास एक अवैध स्तर निष्पादन "निष्पादित करने के लिए रिकर्सिव प्रविष्टि" है। मैं अपने एडाप्टर को एक हैंडलर पर सेट करके ठीक कर सकता हूं, या FragmentPateAdapter के बजाय FragmentStatePagerAdapter का उपयोग कर सकता हूं (Display fragment viewpager within a fragment देखें), लेकिन यदि मेरा एप्लिकेशन क्रैश नहीं होता है, तो जब भी मैं दृश्य पेजर के साथ अपने टुकड़े पर वापस जाता हूं, तो दृश्य पेजर का अपमान होता है !

क्या आप मेरी मदद कर सकते हैं?

जावा स्रोत कोड बोले गए हैं, लेआउट स्रोत कोड है, मुझे लगता है, बेकार।

MainActivity:

public class MainActivity extends SherlockFragmentActivity{ 

private SherlockFragment fragmentOne, fragmentTwo, fragmentThree; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

//  this.fragmentOne = new fragmentOne(); 
//  this.fragmentTwo = new fragmentTwo(); 
//  this.fragmentThree = new fragmentThree(); 
// Call new or instanciate ? What's the correct way ? 

    this.fragmentOne = (SherlockFragment) SherlockFragment.instantiate(this, FragmentOne.class.getName()); 
    this.fragmentTwo = (SherlockFragment) SherlockFragment.instantiate(this, FragmentTwo.class.getName()); 
    this.fragmentThree = (SherlockFragment) SherlockFragment.instantiate(this, FragmentThree.class.getName()); 

    // Add fragment 
    FragmentTransaction transaction = (
     this.getSupportFragmentManager().beginTransaction() 
    );  
    transaction.add(
     R.id.tab_fragment, 
     this.fragmentOne, 
     this.fragmentOne.toString() 
    ); 
    transaction.commit(); 

} 

public void onButtonSelected(View v){ 

    switch (v.getId()){ 

     case R.id.button_one_tab:{ 
      showFragment(this.fragmentThree); 
      break; 
     } 
     case R.id.button_two_tab:{ 
      showFragment(this.fragmentOne); 
      break; 
     } 
     case R.id.button_three_tab:{ 
      showFragment(this.fragmentTwo); 
      break; 
     } 
     default:{ 
      break; 
     } 

    } 

} 

public void showFragment(SherlockFragment fragmentToShow){ 

    FragmentTransaction transaction = (
     this.getSupportFragmentManager().beginTransaction() 
    ); 

    transaction.replace(R.id.tab_fragment, fragmentToShow, fragmentToShow.toString()); 
    transaction.commit(); 

} 

} 

टुकड़ा दो और तीन ही एक ऐसा प्रतिरूप केवल एक TextView शामिल बढ़ा देते हैं। टुकड़ा एक (ध्यान दें कि मैं एक DirectionalViewPager उपयोग कर रहा हूँ - एक lib - एक ViewPager के बजाय):

public class FragmentOne extends SherlockFragment{ 

private FragmentOneAdapter fragmentOneAdapter; 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    // Set up the pager 
    final DirectionalViewPager pager = (DirectionalViewPager)getActivity().findViewById(R.id.pager); 
    if (this.fragmentOneAdapter== null){ 
     this.fragmentOneAdapter= new FragmentOneAdapter (getActivity().getSupportFragmentManager()); 
    } 
    pager.setAdapter(fragmentOneAdapter); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_landing_page, container, false); 
} 

FragmentOneAdapter:

public class FragmentOneAdapter extends FragmentPagerAdapter{ 

private ArrayList<SherlockFragment> fragmentsList; 

public FragmentOneAdapter(FragmentManager fragmentManager) { 

    super(fragmentManager); 

    SherlockFragment fragmentFour = new FragmentFour(); 
    SherlockFragment fragmentFive = new FragmentFive(); 

    this.fragmentsList = new ArrayList<SherlockFragment>(); 
    this.fragmentsList.add(fragmentFour); 
    this.fragmentsList.add(fragmentFive); 

} 

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

@Override 
public int getCount() { 
    return this.fragmentsList.size(); 
} 

} 

आपकी मदद के लिए अग्रिम प्रति धन्यवाद!

उत्तर

3

मैंने अपनी समस्या हल कर ली है!

मैंने को FragmentOne से getChildFragmentManager() पर प्रतिस्थापित किया है। फिर, मैंने अपने तीन अलग-अलग उदाहरणों (यदि मैं ऐसा नहीं करता हूं, तो मेरे पास अपवाद है: java.lang.IllegalStateException: Activity has been destroyed) के बजाय हर बार खंड का नया उदाहरण बनाकर मैंने onButtonSelected की विधि संपादित की है।

मुझे अभी भी इस समाधान के साथ एक समस्या है: प्रत्येक बार जब मैं fragmentOne, fragmentTwo और fragmentThree के बीच स्विच कर रहा हूं तो प्रत्येक खंड की स्थिति खो देता हूं। क्या आपके पास इसका समाधान है?

+1

ओएमजी, मुझे महीनों के लिए एक समान समस्या थी, मैंने इसे ठीक करने में भी आशा खो दी, और यह इतना आसान था! –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^