2012-08-31 14 views
11

में नया लेआउट सेट करें मैं किसी विशेष स्थिति के तहत रनटाइम के दौरान एक टुकड़े के लेआउट को बदलने की कोशिश कर रहा हूं।खंड

प्रारंभिक लेआउट onCreateView() में कुछ बढ़ में:

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

फिर कुछ समय टुकड़ा कोड के भीतर बाद में मैं कुछ अन्य लेआउट के साथ प्रारंभिक लेआउट को बदलने के लिए चाहते हैं।

मैंने अभी तक कुछ चीजों की कोशिश की है; इस नवीनतम है कि मेरे पास है:

private void Something(){ 
    if(checkLicenseStatus(licenseStatus, statusMessage)){ 
       View vv = View.inflate(getActivity(), R.layout.play_video, null); 
       //more code 
    } 
} 

मैं कैसे यह पूरा कर सकते हैं?

उत्तर

8

आप सेट होने के बाद खंड के लेआउट को प्रतिस्थापित नहीं कर सकते हैं। यदि आपको सशर्त लेआउट की आवश्यकता है तो आपको या तो अपने लेआउट को फिर से डिजाइन करना होगा और इसे छोटे टुकड़ों में विभाजित करना होगा, या आप उप कंटेनर (जैसे LinearLayout) में सभी लेआउट तत्वों को समूहित कर सकते हैं, फिर उन्हें RelativeLayout में रखें, एक-दूसरे को ओवरलैप करने और स्वैप करने की स्थिति आवश्यकता होने पर setVisibility() के साथ इन LinearLayout एस की दृश्यता।

4

FragmentManger

के माध्यम से एक FragmentTransaction का प्रयोग करें
FragmentManager fm = getFragmentManager(); 

if (fm != null) { 
    // Perform the FragmentTransaction to load in the list tab content. 
    // Using FragmentTransaction#replace will destroy any Fragments 
    // currently inside R.id.fragment_content and add the new Fragment 
    // in its place. 
    FragmentTransaction ft = fm.beginTransaction(); 
    ft.replace(R.id.fragment_content, new YourFragment()); 
    ft.commit(); 
} 

वर्ग YourFragment के लिए कोड सिर्फ एक LayoutInflater इतना है कि यह एक दृश्य के

public class YourFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.your_fragment, container, false); 

     return view; 
    } 

} 
+4

इस पूरी टुकड़ा जगह है कहते हैं। मैं केवल वर्तमान खंड के लेआउट को बदलने की इच्छा रखता हूं। – Dacto

+0

मुझे भी, मेरे पास के लिए कोई सुराग नहीं है http://stackoverflow.com/questions/28271827/fragment-changing-xml-layout-not-working –

+0

@Dacto आपको टुकड़े को प्रतिस्थापित करना है, आप नहीं बदल सकते 'onAttach()' से 'onDetach()' – surfer190

4

हाँ, मैं निम्नलिखित तरीके से यह किया है देता है। जब मुझे एक नया लेआउट (xml) सेट करने की आवश्यकता होती है, तो निम्न कोड स्निपेट निष्पादित किया जाना चाहिए।

private View mainView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup containerObject, Bundle savedInstanceState){ 
    super.onCreateView(inflater, containerObject, savedInstanceState); 

     mainView = inflater.inflate(R.layout.mylayout, null); 
     return mainView; 
    } 

    private void setViewLayout(int id){ 
    LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    mainView = inflater.inflate(id, null); 
    ViewGroup rootView = (ViewGroup) getView(); 
    rootView.removeAllViews(); 
    rootView.addView(mainView); 
    } 

जब भी मैं लेआउट को बदलने की जरूरत मैं सिर्फ निम्न विधि

setViewLayout(R.id.new_layout); 
+0

'से एक खंड का लेआउट' setViewLayout (R.id.new_layout) ' – kamil09875

+0

पर प्रयास करते समय' android.view.InflateException' प्राप्त करना 'क्या मैं आपका कोड स्निपेट और पूर्ण त्रुटि संदेश देख सकता हूं ? –

+0

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