2013-06-02 19 views
14

में एक नल कंटेनर दिया गया है, मैं एंड्रॉइड डेवलपर वेबसाइट पर ट्यूटोरियल के समान एंड्रॉइड टुकड़ों को एक बहुत ही सरल तरीके से उपयोग करने की कोशिश कर रहा हूं।एंड्रॉइड फ्रैगमेंट को क्रेटव्यू()

public class MediaInfoActivity extends FragmentActivity { 
    private final String TAG = "MediaInfoActivity"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.i(TAG, "onCreate()"); 
     setContentView(R.layout.media_info_activity_layout); 
    } 

} 

यहाँ media_info_activity_layout.xml फ़ाइल के लिए कोड है:: अंत में यहाँ

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <fragment class="com.hawkforce.test.MediaInfoFragment" 
      android:id="@+id/mediaInfoFragment" 
      android:layout_weight="1" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" /> 

    <FrameLayout android:id="@+id/mediaPlayerBarPanel" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" > 

    <fragment class="com.hawkforce.test.MediaPlayerBarFragment" 
       android:id="@+id/mediaPlayerBar" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" /> 

    </FrameLayout> 

और है

मैं एक गतिविधि (MediaInfoActivity) निम्नलिखित कोड से MediaInfoFragment के लिए कोड:

public class MediaInfoFragment extends Fragment { 
    private final static String TAG = "MediaInfoFragment"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.i(TAG, "onCreate()"); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     Log.i(TAG, "onCreateView()"); 
     if (container == null) { 
      Log.i(TAG, "onCreateView(): container = null"); 
     } 

     return inflater.inflate(R.layout.media_info_fragment_layout, container, false); 
    } 

} 

यहां मेरी समस्या है: MediaInfoFragment की onCreateView() विधि में पारित कंटेनर शून्य है। जैसा कि मैंने समझा, यह केवल गैर-यूआई टुकड़ों के मामले में होना चाहिए। हालांकि, मेरे फ्रैगमेंट में एक यूआई है, जिसे मैंने MediaInfoActivity लॉन्च करते समय स्क्रीन पर ठीक प्रदर्शित किया है। यह समस्याएं पैदा करता है क्योंकि खंड की xml लेआउट फ़ाइल में कोई शैली घोषित नहीं की जाती है।

I/MediaInfoActivity: onCreate() 
I/MediaInfoFragment: onCreate() 
I/MediaInfoFragment: onCreateView() 
I/MediaInfoFragment: onCreateView(): container = null 

Am मैं यहाँ कुछ भी स्पष्ट लापता:

यहाँ मेरी लॉग है?

+0

आप झूठी उपयोग करते हैं इसका मतलब है कि यह कंटेनर से जुड़ा नहीं है। –

+0

आपका मतलब inflater में है, है ना? मैंने इसे सच में बदल दिया लेकिन कोई बदलाव नहीं हुआ। इसके अलावा इस पंक्ति: 'onCreateView(): कंटेनर = null' inflater को कॉल से पहले दिखाया गया है। मेरी समस्या वास्तव में है कि एंड्रॉइड क्रिएटिव्यू() पर दूसरे तर्क के रूप में शून्य हो जाता है और मुझे नहीं पता कि यह कहां से आता है। – HawkForce

+0

- http://stackoverflow.com/questions/27306805/android-fragment-oncreateview-container-is-null - http://stackoverflow.com/questions/24589202/android-fragments-container-variable-in- oncreateview-है-शून्य – pRaNaY

उत्तर

2

मुझे यकीन है कि के बाद से मैं मेरे सामने SDK के कोड की जरूरत नहीं है नहीं कर रहा हूँ, लेकिन मुझे लगता है कि टुकड़ा "onCreateView" बुलाने की जीवन-चक्र समारोह दो मामलों के बीच अलग है: 1। लेआउट में खंड की स्थिर सेटिंग्स 2. FragmentManager के साथ व्यावहारिक रूप से लोड हो रहा है।

जब बुला:

पहले मामले में डिबगर OnCreate() कोड के भाग के रूप जनक गतिविधि करने के लिए सामग्री को देखने जोड़ने पर तुरंत Fragment.onCreateView() विधि में मिल setContentView (R.layout.some_layoue); आप अगली पंक्ति

को Fragment.onCreateView()OnCreate (के बाद ही लागू किया जा रहा है) के जा रहा दूसरे मामले में पहले डिबगर Fragment.onCreateView() में मिल देखेंगे गतिविधि समाप्त हो गई है।

यह मेरे लिए डिज़ाइन बग जैसा दिखता है लेकिन संभवतः डिज़ाइन सुविधा के रूप में। वैसे भी कंटेनर शून्य रूप से खंड जोड़ते समय शून्य है क्योंकि संबंधित ऑब्जेक्ट अभी तक नहीं बनाया गया था।

वास्तव में दोनों स्थितियों के बीच अंतर बहुत गहरा है। टुकड़ों के बीच टॉगलिंग के स्थिर टुकड़ों के मामले में दृश्य पदानुक्रम सही ढंग से नहीं बनाएगा।

उदाहरण के लिए यदि आप टुकड़ा एक और बटन-बी के लिए बटन-ए जोड़ देगा टुकड़ा-बी के लिए और टॉगल टुकड़े के साथ एक कोड इस तरह दिखता है (केवल प्रासंगिक कोड पर प्रकाश डाला):

public void turnOnFragment() { 
    FragmentManager manager = getFragmentManager(); 
    if (manager != null) { 
     manager.beginTransaction() 
       .setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out) 
       .attach(this) 
       .commit(); 
    } 
} 



public void turnOffFragment() { 
    FragmentManager manager = getFragmentManager(); 
    if (manager != null) { 
     manager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     manager.beginTransaction() 
       .setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out) 
       .detach(this) 
       .commit(); 


    } 
} 

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

इस संस्करण 4.4.2

3

तुम सिर्फ अपने टुकड़ा में bellow तरह एक inflater बनाने के लिए के साथ मेरा अनुभव के आधार पर है।

View rootView; 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    if (rootView == null) { 
     rootView = inflater.inflate(R.layout.activity_my_cart, null); 
    } else { 
     ((ViewGroup) container.getParent()).removeView(rootView); 
    } 
    return rootView; 
} 

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

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