2011-09-25 15 views
8

में अशक्त मैं एक कस्टम संवाद लिखने और अपनी मूल गतिविधि से कुछ डेटा प्राप्त करने की कोशिश देता है, लेकिन मैं हमेशा अशक्त मिलता है जब मैं getOwnerActivity कहते हैं, किसी को भी मुझे बता वजह से ऐसा हो सकता है? TestDialogActivity से डेटा दिखाने में विफल होने पर मैं डेमोडियलॉग में डेटा क्यों दिखा सकता हूं?getOwnerActivity कस्टम संवाद

अग्रिम में बहुत धन्यवाद।

DialogTestActivity

public class DialogTestActivity extends Activity { 
    List<String> data = new ArrayList<String>(); 
    Button button; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     button = (Button)findViewById(R.id.button); 
     button.setOnClickListener(new OnClickListener(){ 
      public void onClick(View v) { 
       showDialog(0); 
      } 
     }); 
    } 

    public List<String> getData(){ 
     data.add("one"); 
     data.add("two"); 
     data.add("three"); 
     return data; 
    } 

    public Dialog onCreateDialog(int id){ 
     return new DemoDialog(this); 
    } 
} 

DemoDialog

public class DemoDialog extends Dialog { 
    Context context; 

    public DemoDialog(Context context) { 
     super(context); 
     setContentView(R.layout.dialog); 
     this.context = context; 
     setTitle("Delete City"); 
     ListView list = (ListView)findViewById(R.id.list); 
     ArrayAdapter<String> aa = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_multiple_choice, ((DialogTestActivity)getOwnerActivity()).getData()); 
//  ArrayAdapter<String> aa = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_multiple_choice, getData()); 
     list.setAdapter(aa); 
     list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    } 

    private List<String> getData(){ 
     List<String> data = new ArrayList<String>(); 
     data.add("1"); 
     data.add("2"); 
     return data; 
    } 
} 

उत्तर

5

आप इस स्थिति के बारे में सोचते हैं, तो आप क्यों समझ जाएगा। जब आप new DemoDialog(this) पर कॉल करते हैं, तो आप कन्स्ट्रक्टर में सभी कोड निष्पादित करते हैं। इसके बाद, आप इसे onCreateDialog से वापस कर दें और एंड्रॉइड इसका जादू करता है। यदि आप निर्माता को निर्माता से प्राप्त करने का प्रयास करते हैं, तो एंड्रॉइड ने इसे अभी तक नहीं जोड़ा है, इसलिए आपके पास अभी तक कोई मालिक नहीं है। क्योंकि

+0

नोट: मेरा मतलब है संवाद की OnCreate() कॉल। हालांकि, अगर आप विफल हो जाते हैं, तो आपको इसे अटैचट टॉविंडो() में डालने की आवश्यकता हो सकती है, क्योंकि एंड्रॉइड वास्तव में अपने जादू को मनमाने ढंग से रोक सकता है। उस ने कहा, यदि आपको निर्माता से मालिक तक पहुंचने की आवश्यकता है, तो मालिक "संदर्भ" है, इसलिए बस "संदर्भ" का उपयोग करें :) – Sajid

+0

आपके उत्तर के लिए धन्यवाद, साजिद। मैंने आपके सुझाव का पालन करने की कोशिश की लेकिन साइटल शून्य हो गया, क्या आप अपना कोड साझा कर सकते हैं? – eric2323223

+0

ऊपर एक संपादन के रूप में जोड़ा गया। आपको एटैच टॉविंडो() पर जांच करनी होगी। – Sajid

16

मैं अपने custom Dialog के सभी संभव तरीकों में getOwnerActivity() विधि का उपयोग करने की कोशिश की

public class DemoDialog extends Dialog { 
    public DemoDialog(Context context) { 
     super(context); 

     // chances of context not being an activity is very low, but better to check. 
     Activity owner = (context instanceof Activity) ? (Activity)context : null; 
     if (owner != null) { 
      // owner activity is defined here 
     } 
    } 

    public void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     // getOwnerActivity() should be defined here if called via showDialog(), so do the related init here 
     Activity owner = getOwnerActivity(); 
     if (owner != null) { 
      // owner activity defined here 
     } 
    } 
} 

ध्यान दें कि दूसरी विधि पसंद किया जाता है:

तो तुम इनमें से किसी कर सकते हैं। यह हमेशा शून्य (एंड्रॉइड 2.3) देता है। फिर मैंने अपना सोर्स कोड चेक किया और जिस गतिविधि को वह लौटाता है वह केवल setOwnerActivity(Activity activity) में सेट होता है जिसे कहीं भी नहीं कहा जाता है। तो अगर आप getOwnerActivity() मान शून्य से अलग लौटना चाहते, तो आप इस करना है:

public MyCustomDialog(Context context) { 
    super(context); 
    if (context instanceof Activity) { 
     setOwnerActivity((Activity) context); 
    } 
} 
+0

सच !!!!!!!!!!! –

0

यह नीचे दिए गए, मेरे लिए काम किया।

private Activity activity; 

public MyCustomDialog(Activity activity) { 
    super(activity); 
    this.activity = activity; 
} 

फिर मैं getOwnerActivity() के बजाय गतिविधि का उपयोग करता हूं।

1

आप कर सकते हैं इस कोड द्वारा से AppCompatDialog अपने कस्टम संवाद और गतिविधि के लिए उपयोग का विस्तार:

public static Activity scanForActivity(Context context) { 
    if (context == null) 
     return null; 
    else if (context instanceof Activity) 
     return (Activity) context; 
    else if (context instanceof ContextWrapper) 
     return scanForActivity(((ContextWrapper) context).getBaseContext()); 
    return null; 
} 
संबंधित मुद्दे