21

नहीं कहा जाता है मैं एंड्रॉइड संगतता लाइब्रेरी (v4 संशोधन 8) का उपयोग कर रहा हूं। कस्टम डायलॉग फ्रैगमेंट में ओवरव्यूड विधि ऑन व्यूक्रेटेड को कॉल नहीं किया जा रहा है। उदाहरण के लिए।Android DialogFragment onViewCreated

public class MyDialogFragment extends DialogFragment{ 
    private String mMessage; 
    public MyDialogFragment(String message) { 
     mMessage = message; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState){ 
     super.onCreateDialog(savedInstanceState); 
     Log.d("TAG", "onCreateDialog"); 
     setRetainInstance(true); 
     //....do something 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     Log.d("TAG", "onViewCreated"); 
     //...do something 
    } 
} 

ऑनव्यूक्रेटेड लॉग इन नहीं हो रहा है।

+0

क्या आपको इस दौरान इसका समाधान मिला है? –

उत्तर

14

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

डायलॉगफ्रैगमेंट क्रिएटडिअलॉग पर उपयोग करता है और क्रिएटिव्यू पर नहीं, इसलिए ViewCreated को निकाल दिया नहीं जाता है। (मेरा कामकाजी सिद्धांत होगा, मैंने पुष्टि करने के लिए एंड्रॉइड स्रोत में डाला नहीं है)।

+0

मेरी समस्या इस तरह की है http://stackoverflow.com/questions/7692713/onviewcreated-with-compatibility-library लेकिन समाधान काम नहीं कर रहा है –

+6

'ऑनक्रेट व्यू' को डायलॉगफ्रैगमेंट बनाने के दौरान निकाल दिया जाता है, भले ही 'onCreateDialog' '। फिर भी, डायलॉग फ्रैगमेंट बनाने के दौरान 'ऑन व्यूक्रेटेड' को निकाल दिया नहीं जाता है। अजीब व्यवहार। – losttime

+0

जब आप super.onCreateDialog वापस आते हैं तो CreateView पर संवाद प्रारूप का उपयोग करें। – njzk2

7

मेरे परीक्षण से, onViewCreated कहा जाता नहीं है, तो onCreateView अशक्त है, जो डिफ़ॉल्ट व्यवहार है, इसलिए यदि आप onCreateView उपयोग नहीं कर रहे लेकिन मैन्युअल onCreateDialog में setContentView बुला देता है, तो आप मैन्युअल onCreateDialog से onViewCreated कॉल कर सकते हैं:

@Override public Dialog onCreateDialog(Bundle savedInstanceState) { 
    final Dialog d = super.onCreateDialog(savedInstanceState); 
    d.setContentView(R.layout.my_dialog); 
    // ... do stuff.... 
    onViewCreated(d.findViewById(R.id.dialog_content), savedInstanceState); 
    return d; 
} 

इस मामले में, यह सुनिश्चित करें my_dialog.xml में मूल तत्व android:id="@+id/dialog_content"

+1

इस दृष्टिकोण के साथ एकमात्र समस्या यह है कि यदि आप 'डायलॉग फ्रैगमेंट' को एम्बेड कर रहे हैं; इस मामले में, 'ऑन व्यूक्रेटेड' को दो बार बुलाया जाएगा। –

2

है डॉक (Selecting Between Dialog or Embedding) और होने इसे अपने आप द्वारा परीक्षण किया गया है, तो आप OnCreateVi ओवरराइड कर सकते हैं के अनुसार बनाने के ew, इसे अपने कस्टम लेआउट के साथ फुलाएं और इसे वापस करें। ,

पहले जब से तुम ओवरराइड नहीं करते onCreateView() अपने टुकड़ा का दृष्टिकोण अशक्त हो जाएगा: OnViewCreated

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
      View view = inflater.inflate(R.layout.custom_layout, null); 
      //do whatever   
      return view; 
    } 
3

आप देख सकते हैं क्या स्रोत कोड से हो रहा है शुरू किया जाएगा। ,

// android.support.v4.app.Fragment.java 
@Nullable 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 
     @Nullable Bundle savedInstanceState) { 
    return null; 
} 

दूसरा जब से तुम कर रहे हैं दृश्य है अशक्त FragmentManageronViewCreated() फोन नहीं होगा: डिफ़ॉल्ट रिटर्न null - यह source code of Fragment से देखा जा सकता। source code of FragmentManager से:

// android.support.v4.app.FragmentManager.java 
if (f.mView != null) { 
    f.mInnerView = f.mView; 
    // ... 

    // only called if the fragments view is not null! 
    f.onViewCreated(f.mView, f.mSavedFragmentState); 
} else { 
    f.mInnerView = null; 
}