2012-05-10 20 views
5

मुझे वर्तमान में डायलॉगफ्रैगमेंट्स के साथ कुछ समस्याएं आ रही हैं। मैं नवीनतम v.4 समर्थन संकुल का उपयोग कर रहा हूं (संशोधन 8 मुझे विश्वास है) मेरी समस्या यह है कि यदि संवाद खुला रहता है तो मेरे फोन का अभिविन्यास बदलता है, तो एप्लिकेशन अभिनय को शुरू करता है।डायलॉगफ्रैगमेंट ओरिएंटेशन चेंज क्रैश एट एक्टिविटी()

वर्तमान में मेरा आवेदन इस तरह काम करता है: एक फ्रैगमेंट एक्टिविटी है, यह एक टुकड़ा कहता है। यह टुकड़ा फिर एक DialogFragment (getActivity() के माध्यम से कहता है। GetSupportFragmentManager()।

तो उन्मुखीकरण परिवर्तन करते हुए संवाद खुला है, getActivity() टुकड़ा = अशक्त में। यह एक समस्या का कारण बनता है अगर मैं चाहता हूँ गतिविधि आदि

आप संवाद खोलने के इस पैदा करने के लिए समाप्त करने, अभिविन्यास एक बटन बदल सकते हैं और प्रेस के बाद ही आप बटन दबाएँ यह दुर्घटनाओं

मेरे DialogFragment AlertDialogFragment कहा जाता है:।

public class AlertDialogFragment extends DialogFragment { 
private static Builder mBuilder; 
private static DialogInterface.OnClickListener mListener; 

public static AlertDialogFragment newInstance(Context context, DialogInterface.OnClickListener listener) { 
    mBuilder = new AlertDialog.Builder(context); 
    mListener = listener;  
    return new AlertDialogFragment(); 
} 

//... some functions to set Icons etc 

public void setButton(int whichButton, CharSequence buttonText) { 
    final DialogInterface.OnClickListener listener = mListener == null ? null : mListener;  
    mBuilder.setPositiveButton(buttonText, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       listener.onClick(dialog, whichButton); 
      } 
    }); 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    return mBuilder.create(); 
} 
} 

public class TestBedFragment extends Fragment implements DialogInterface.OnClickListener { 
// onCreateView Stuff 

private void showCrashDialog() { 
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); 
    AlertDialogFragment newDialog = AlertDialogFragment.newInstance(getActivity(), this); 
    newDialog.setTitle("Test");  
    newDialog.setIcon(android.R.drawable.ic_dialog_alert); 
    newDialog.setMessage("Testing testing testing... 1, 2, 3... Just press Ok."); 
    newDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Ok"); 
    newDialog.show(ft, "dialog"); 

    // Cause the problem. Simulate the user turning the screen 
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
} 

@Override 
public void onClick(DialogInterface dialog, int which) { 

    /* 
    * hexnumber = a hex number 
    * Normally equals: TestBedFragment{hexnumber #0 id=hexnumber} 
    * With crash equals: TestBedFragment{hexnumber} 
    */ 
    Log.e("TestBedFragment", "this = " + this); 

    /* 
    * hexnumber = a hex number 
    * Normally equals: [email protected] 
    * With crash equals: null 
    */ 
    Log.e("TestBedFragment", "getActivity() = " + getActivity()); // Will equal null... ??? 

    getActivity().finish(); 
} 
} 

मैं इस के कारण क्या भी यकीन नहीं है:

यह टुकड़ा है? क्षमा करें अगर यह एक बेवकूफ सवाल है। मैंने 'विंडोज लीकिंग' के बारे में अन्य स्थानों में पढ़ा है, फिर भी मैंने लॉगकट में उस सामान का कोई उल्लेख नहीं देखा है।

किसी को भी मेरी मदद कर सकते :) इसकी बहुत सराहना

धन्यवाद

उत्तर

0

आप सब कुछ पुनः कर रहे हैं के बजाय बंडल का उपयोग कर। एक नल बंडल की जांच के लिए अपने ऑनक्रेट डायलॉग पर if जोड़ें। यदि यह शून्य है, तो अपनी सृजन सामग्री करें, अन्यथा कुछ भी नहीं करें और एंड्रॉइड बंडल से सबकुछ बहाल करेगा।

मुझे लगता है कि यह आपकी समस्या को ठीक करेगा।

if(SavesIinstanceState == null); { 
    // your code 
} 
1

आपको गतिविधि जीवन चक्र को समझना होगा। हर बार जब आप डिवाइस को घुमाते हैं, तो गतिविधि को फिर से बनाया जाता है। इसका मतलब है कि वर्ग का एक नया उदाहरण निष्पादित हो रहा है।

आपके कोड में क्या होता है कि, एक घूर्णन के बाद, श्रोता कॉल पिछले गतिविधि के संदर्भ में पिछले संवाद उदाहरण पर सक्रियता प्राप्त करता है। लेकिन यह गतिविधि अब मान्य नहीं है, यह घूर्णन के बाद "नष्ट" हो गई है और एक नया दिखाई दिया है।

आप प्राप्त करने के लिए कॉल करते हैं सक्रियता अब मान्य नहीं है।

क्या आप ड्रेस्ट्रॉय विधि पर खंड के दौरान अपना खुला संवाद बंद नहीं कर सकते?

1

आप अपने संवाद को रोकें() में खारिज कर सकते हैं और क्रिएट() में संवाद को जांचने और दिखाने के लिए एक सशर्त उपयोग कर सकते हैं। यह आपके विशिष्ट उपयोग-मामले के आधार पर ऑनस्टॉप() या ऑनस्ट्रोय() में अधिक उपयुक्त हो सकता है।

@Override 
protected void onPause() { 
    if (myDialog != null && myDialog.isVisible()) 
     myDialog .dismiss(); 
    super.onPause(); 
} 
संबंधित मुद्दे