2013-10-27 6 views
13

मैं हाल ही में टुकड़े का उपयोग कर जो इस तरह दिखता है एक डेमो एप्लिकेशन बनाया है शुरू कर दिया है:टुकड़ों के समान उदाहरण को कैसे सहेजने और पुन: उपयोग करने के लिए?

टुकड़ा 1 के बीच प्रत्येक बटन स्विच पर

Demo App

क्लिक करना, टुकड़ा 2 और खंड 3.

मैं क्या कर रहा हूँ पूरा करने की कोशिश करना केवल प्रत्येक टुकड़े का 1 उदाहरण है और इसका पुन: उपयोग करना है। (कृपया ध्यान दें कि सभी टुकड़े बनाए गए हैं और गतिशील रूप से जोड़े गए हैं)। वर्तमान में मैं इसे टुकड़े का हैश मैप बनाकर और प्रत्येक उदाहरण को रखकर और वहां से इसे पकड़कर कर रहा हूं।

तो मेरे प्रश्न हैं: क्या ऐसा करने का एक बेहतर तरीका है: FragmentManager की putFragment (...) विधि का उपयोग करके? putFragment (Bundle bundle, String key, Fragment fragment) मैं यह नहीं समझ सकता कि मेरे मामले में इसका उपयोग कैसे किया जाए। अगर कोई मुझे इस विधि का उपयोग करने का उदाहरण दे सकता है।

क्या यह मेरी गतिविधि में प्रत्येक टुकड़े के संदर्भ में पकड़ना महंगा है? क्या यह सभी टुकड़ों को जीवित रखता है? मैं इससे निपटने के लिए नरम संदर्भ का उपयोग कर रहा हूं लेकिन मुझे यकीन नहीं है कि यह करने का यह सही तरीका है या नहीं। कृपया मुझे ऐसा करने के किसी भी वैकल्पिक तरीके की ओर इशारा करें या मुझे यह बताने दें कि यह पूरा करने का यह सबसे अच्छा तरीका है या नहीं।

अग्रिम धन्यवाद।

अद्यतन: मैं वापस ढेर से टुकड़े पुन: उपयोग करने, की कोशिश कर रहा है, तो इसे वापस ढेर में मौजूद नहीं है केवल उन्हें जोड़ने कोशिश कर रहा हूँ

यहाँ मेरी कोड है।

10-28 13:21:40.255: ERROR/MessageQueue-JNI(3548): java.lang.IllegalStateException: Fragment already added: FragmentOne{423db570 #0 id=0x7f050006 fragOne} 

public class MainActivity extends Activity implements View.OnClickListener { 

private Button btnOne; 
private Button btnTwo; 
private Button btnThree; 

/* Called when the activity is first created. 
    */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    initialize(); 
    if(findViewById(R.id.fl) != null){ 
     if(savedInstanceState != null) 
      return; 
    } 

    FragmentManager.enableDebugLogging(true); 
    updateView("fragOne"); 
} 

private void initialize(){ 
    btnOne = (Button) findViewById(R.id.button1); 
    btnTwo = (Button) findViewById(R.id.button2); 
    btnThree = (Button) findViewById(R.id.button3); 
    btnOne.setOnClickListener(this); 
    btnTwo.setOnClickListener(this); 
    btnThree.setOnClickListener(this); 
    fragHolder = new HashMap<String, SoftReference<Fragment>>(); 
} 

private void updateView(String tag){ 
    FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    Fragment frag = getFragmentManager().findFragmentByTag(tag); 

    boolean addToStack = true; 
    if(frag == null){ 
     if(tag.equals("fragOne")) 
      frag = new FragmentOne();  
     else if(tag.equals("fragTwo")) 
      frag = new FragmentTwo(); 
     else if(tag.equals("fragThree")) 
      frag = new FragmentThree(); 
    }else{ 
     //Don't add to back stack 
     addToStack = false; 
    } 
    ft.replace(R.id.fl, frag, tag); 
    if(addToStack) 
     ft.addToBackStack(null); 
    ft.commit(); 
} 

    @Override 
    public void onClick(View v) { 
     switch(v.getId()){ 
      case R.id.button1: 
       updateView("fragOne"); 
       break; 
      case R.id.button2: 
       updateView("fragTwo"); 
       break; 
      case R.id.button3: 
       updateView("fragThree"); 
       break; 
     } 
    } 
} 
+0

क्या आपने FragmentTransactions में देखा है? वे आपके लिए सहायक हो सकते हैं। –

उत्तर

2

एक FragmentTransaction प्रदर्शित करने के लिए, निम्न नमूना करने के लिए उपयोगी हो सकता है: -> वापस आ इसे करने के लिए -> फिर बटन वापस प्रेस करने की कोशिश नीचे कोड के बाद मैं टुकड़ा से दूर नेविगेट भी मुझे अवैध राज्य अपवाद देता है आप।

सबसे पहले, आप अपनी गतिविधि के onCreate() में अपनी सभी प्रारंभिक सामग्री करना चाहते हैं, जो आपके पास सही है, लेकिन हम कुछ बदलाव करेंगे।

public class MainActivity extends Activity implements View.OnClickListener { 

private Button btnOne; 
private Button btnTwo; 
private Button btnThree; 

/* Called when the activity is first created.*/ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    initialize(); 
    if(findViewById(R.id.fl) != null) 
    { 
     if(savedInstanceState != null) 
     { 
      FragmentTransaction trans = getFragmentManager().beginTransaction(); 

      //This is where we add our first fragment 
      trans.add(R.id.fl, new FragmentOne()); 
      trans.commit(); 
     } 
    } 
} 

private void initialize() 
{ 
    btnOne = (Button) findViewById(R.id.button1); 
    btnTwo = (Button) findViewById(R.id.button2); 
    btnThree = (Button) findViewById(R.id.button3); 
    btnOne.setOnClickListener(this); 
    btnTwo.setOnClickListener(this); 
    btnThree.setOnClickListener(this); 
} 

public void onClick(View view) 
{ 
    //Here is where we'll actually transfer the fragments 

    FragmentTransaction trans = getFragmentManager().beginTransaction(); 
    switch(v.getId()){ 
     case R.id.button1: 
      trans.replace(R.id.fl, new FragmentOne()); 
      trans.addToBackStack(null); 
      trans.commit(); 
      break; 
     case R.id.button2: 
      trans.replace(R.id.fl, new FragmentTwo()); 
      trans.addToBackStack(null); 
      trans.commit(); 
      break; 
     case R.id.button3: 
      trans.replace(R.id.fl, new FragmentThree()); 
      trans.addToBackStack(null); 
      trans.commit(); 
      break; 
    } 
} 

यह आपको एक टुकड़े से अगले में आसानी से संक्रमण करने की अनुमति देगा।

+0

आपके उत्तर के लिए धन्यवाद। मैंने शुरुआत में इस दृष्टिकोण की कोशिश की, हालांकि यह प्रत्येक लेनदेन को बैकस्टैक में जोड़ता है जिससे यह प्रत्येक लेनदेन के लिए आकार में बढ़ता रहता है। जैसा कि मैंने बताया है कि स्मृति मेरे वास्तविक ऐप में एक समस्या है। इसलिए मैं बैक स्टैक में प्रविष्टियों की संख्या को सीमित करना चाहता हूं। मुझे लगता है कि एक बेहतर सवाल होगा: यदि फीफा कतार के रूप में बैकस्टैक का उपयोग करना संभव है -> 10 लेनदेन के बाद 11 वें जोड़ते समय 1 को छोड़ दें। – Naveed

+1

आप 'disallowAddToBackStack()' को कॉल कर सकते हैं और स्थिर स्टिकर पर कुछ चीजें हैं जब एक स्थिर पूर्णांक या कुछ का ट्रैक रखें। –

+0

धन्यवाद जिसने मुझे प्राप्त होने वाले अवैध राज्य अपवाद को भी हल किया। अभी भी एक ही टुकड़े को जोड़ने पर काम करने की आवश्यकता नहीं है यदि आप पहले से ही हैं लेकिन यह काफी आसान है। – Naveed

1

FragmentManager यह स्वयं का स्मृति प्रबंधन करता है। यह आपके तर्क के अनुसार आपके उदाहरणों को याद/मार देगा या याद रखेगा। आप यह सुनिश्चित कर सकते हैं कि onSaveInstanceState()

या आप अपने टुकड़े पर setRetainInstance(true) का उपयोग करके सिस्टम को अपने उदाहरण को जीवित रखने के लिए मजबूर कर सकते हैं।

इस प्रकार आप एक लेनदेन बनाते हैं।

FragmentTransaction fragmentTransaction = context.getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.replace(R.id.layout, new MyFragment(), f.getClass().getName()); 
    fragmentTransaction.commit(); 
+1

उत्तर के लिए धन्यवाद। मैं इससे पहले इस दृष्टिकोण की कोशिश कर रहा था, मैंने देखा कि केवल एक ही अंतर यह था कि यदि आप खंड में कुछ टाइप करते हैं, और उसके बाद इसे खंड दो के साथ प्रतिस्थापित करते हैं, तो वापस नेविगेट करते समय खंड का एक नया उदाहरण बनाते हैं जिससे आप उस परिवर्तन को खोलेंगे वही उदाहरण (जिस स्थिति में पाठ अभी भी वहां होगा) – Naveed

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