android - घूर्णन करते समय फ्रैगमेंट ऑब्जेक्ट को बनाए रखें




android-fragments android-3.0-honeycomb (4)

मैंने हनीकॉम में एक ऐप विकसित किया है और मैं टुकड़ों का उपयोग कर रहा हूं।
यह मेरा ऐप है

  • मेरे पास एक गतिविधि है (ए 1 कहें) और इसमें एक टुकड़ा है
  • प्रारंभ में यह खंड वस्तु को एक टुकड़ा वस्तु कहता है (एफ 1)
  • फिर उपयोगकर्ता क्रियाओं के आधार पर यह अन्य वस्तुओं F2, F3 में बदल सकता है ....

मेरी समस्या क्या है

जब उपयोगकर्ता डिवाइस को घुमाता है तो गतिविधि को फिर से बनाया जाता है और जो घुमाव से पहले F1 को खंड वस्तु के रूप में बनाता है, हालांकि यह नहीं था
What is the way to retain the fragment object while rotating?
मैंने setRetainInstance(true); उपयोग किया setRetainInstance(true); लेकिन यह मेरे लिए काम नहीं किया
और मैंने इस तरह मेरे कोड onCreate फ़ंक्शन में कोड द्वारा खंड जोड़ा है

@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);

   FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();

   Fragment homeFragment = new Home();
   fragmentTransaction.add(R.id.mainFragement, homeFragment);
   fragmentTransaction.commit();
}


आपको अपने टुकड़े को एक अनूठा टैग देना होगा, और जांचें कि क्या यह टुकड़ा पहले से ही आपकी गतिविधि में जोड़ा गया है या नहीं।

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    String tag = "my_fragment";
    FragmentManager fragmentManager = getFragmentManager();
    if(fragmentManager.findFragmentByTag(tag) == null) {
        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        Fragment homeFragment = new Home();
        fragmentTransaction.add(R.id.mainFragement, homeFragment, tag);
        fragmentTransaction.commit();
    }
}

यह जांचना कि savedInstanceState शून्य है, यह जांचने का एक सुरक्षित तरीका नहीं है कि आपका टुकड़ा पहले से सेट है या नहीं - यह ज्यादातर मामलों में काम करेगा, लेकिन कुछ मामलों में (जैसे कि डिवाइस कम मेमोरी पर है), एंड्रॉइड आपकी गतिविधि को मार सकता है, जो कर सकता है अपना आवेदन तोड़ो

इसे क्रिया में देखने के लिए, डिवाइस के विकास विकल्पों में "गतिविधियां न रखें" पर टिकटें (सेटिंग एंड्रॉइड 4.0+ में उपलब्ध है, पिछले संस्करणों के बारे में निश्चित नहीं है)। जब आप एक नई गतिविधि खोलते हैं, तो आपकी पहली गतिविधि नष्ट हो जाती है। जब आप इसे वापस लौटते हैं (वापस दबाकर), यह फिर से बनाया जाता है, और सहेजा गया इन्स्टेंसस्टेट शून्य नहीं है । हालांकि, आपका टुकड़ा अब गतिविधि में नहीं है, और आपको इसे फिर से जोड़ना होगा।

संपादित करें - मूल सिद्धांत दिखा रहा है लेकिन SupportFragmentManager के साथ

public class ActivityAwesome extends AppCompatActivity
{
    private final String TAG = getClass().getSimpleName();
    private FragmentHome mHomeFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_layout);

        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment fragment = fragmentManager.findFragmentByTag(TAG);
        if(fragment == null)
        {
            // Create the detail fragment and add it to the activity using a fragment transaction.
            mHomeFragment = new FragmentHome();
            fragmentManager.beginTransaction()
                    .add(R.id.fragment_container, mHomeFragment, TAG)
                    .commit();
        }
        else
        {
            // get our old fragment back !
            mHomeFragment = (FragmentHome)fragment;
        }
    }
}

यह विशेष रूप से उपयोगी होता है यदि आप अपने डिवाइस को घूर्णन करने के बाद खंड (इस मामले में mHomeFragment ) में हेरफेर करना चाहते हैं


डिफ़ॉल्ट रूप से एंड्रॉइड खंड वस्तुओं को बनाए रखेगा। अपने कोड में आप अपने homeFragment फ़ंक्शन में homeFragment सेट कर रहे हैं। यही कारण है कि यह हमेशा कुछ homeFragment या आप जिस चीज को सेट करते हैं उस पर homeFragment

क्योंकि जब भी आप घूमते हैं, तो ऑनक्रेट निष्पादित करेगा और आपके टुकड़े वस्तु को पहले स्थान पर सेट करेगा

तो आपके लिए आसान समाधान यह savedInstanceState कि savedInstanceState बंडल शून्य है या नहीं और खंड वस्तु सेट करें

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

    if(null == savedInstanceState) {
        // set you initial fragment object 
    }
 }

मैंने गतिविधि के लेआउट में एक Fragment परिभाषित किया है, Fragment में onSaveInstanceState किया जाता है, लेकिन Fragment's onCreatView Bundle को शून्य के रूप में आता है।

कारण यह था कि मेरे Fragment में एक्सएमएल में आईडी नहीं थी:

android:id="@+id/compass_fragment" ...




screen-rotation