2013-01-04 25 views
5

मैं एक गतिविधि है और सभी मैं चाहता हूँबलपूर्वक बंद करें जब खुले दिनांक DialogueFragment साथ अभिविन्यास परिवर्तन

गतिविधि है -> कुछ लेआउट करें OnClick (यह TextView है) -> ओपन Datepicker -> सेट txtvalue

में चयनित मान नीचे कोड के साथ डायलॉग फ्रैगमेंट का उपयोग करके डेटपिकर को मिस करना चाहते हैं।

package com.app.ourforms.date; 

import java.util.Calendar; 

import android.app.DatePickerDialog; 
import android.app.Dialog; 
import android.app.DialogFragment; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.DatePicker; 
import android.widget.TextView; 

public class DatePickerFragment extends DialogFragment implements 
     DatePickerDialog.OnDateSetListener { 

    TextView txt; 

    public DatePickerFragment() { 
    } 

    public DatePickerFragment(TextView txt) { 
     this.txt = txt; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceSateate) { 

     Log.i("TAG", "Inside onCreateDialog"); 
     final Calendar c = Calendar.getInstance(); 
     int year = c.get(Calendar.YEAR); 
     int month = c.get(Calendar.MONTH); 
     int day = c.get(Calendar.DAY_OF_MONTH); 

     return new DatePickerDialog(getActivity(), this, year, month, day); 
    } 

    public void onDateSet(DatePicker view, int year, int month, int day) { 
     Log.i("TAG", "Inside onDateSet"); 
     txt.setText(day + "/" + (month + 1) + "/" + year); 
     // Do something with the date chosen 
    } 
} 

ऊपर कोड ठीक काम करता है जब डिवाइस अपना अभिविन्यास नहीं बदलता है। लेकिन जब Datepicker दिखाया गया है और अभिविन्यास परिवर्तन मैं करीब बल मिल रहा है नीचे

01-04 07:34:14.580: E/AndroidRuntime(2375): FATAL EXCEPTION: main 
01-04 07:34:14.580: E/AndroidRuntime(2375): java.lang.NullPointerException 
01-04 07:34:14.580: E/AndroidRuntime(2375):  at com.app.ourforms.date.DatePickerFragment.onDateSet(DatePickerFragment.java:39) 
01-04 07:34:14.580: E/AndroidRuntime(2375):  at android.app.DatePickerDialog.tryNotifyDateSet(DatePickerDialog.java:148) 
01-04 07:34:14.580: E/AndroidRuntime(2375):  at android.app.DatePickerDialog.onClick(DatePickerDialog.java:116) 
01-04 07:34:14.580: E/AndroidRuntime(2375):  at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) 
01-04 07:34:14.580: E/AndroidRuntime(2375):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-04 07:34:14.580: E/AndroidRuntime(2375):  at android.os.Looper.loop(Looper.java:137) 
01-04 07:34:14.580: E/AndroidRuntime(2375):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
01-04 07:34:14.580: E/AndroidRuntime(2375):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-04 07:34:14.580: E/AndroidRuntime(2375):  at java.lang.reflect.Method.invoke(Method.java:511) 
01-04 07:34:14.580: E/AndroidRuntime(2375):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
01-04 07:34:14.580: E/AndroidRuntime(2375):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
01-04 07:34:14.580: E/AndroidRuntime(2375):  at dalvik.system.NativeStart.main(Native Method) 

के रूप में यहाँ DatePickerFragment

बुला
public void showDatePickerDialog(View v) { 
     Log.i("TAG", "Inside showDatePickerDialog"); 
     DialogFragment newFragment = new DatePickerFragment((TextView)v); 
     newFragment.show(getFragmentManager(), "datePicker"); 
    } 

कृपया मुझे इस से बाहर निकलना करने के लिए मदद के लिए मेरे विधि है। अग्रिम में धन्यवाद।

उत्तर

3

मुझे यकीन नहीं है कि यह समाधान आपके लिए काम करता है लेकिन आप इसे आजमा सकते हैं।

समस्या जिसका आप सामना कर रहे हैं क्योंकि आपकी ओरिएंटेशन परिवर्तन हर बार आपकी गतिविधि रीलोड होती है। आप OnConfigurationchanged() विधि और मेनिफेस्ट फ़ाइल के अंदर कॉल कर सकते हैं, आप कॉन्फ्यूचेंज को orientation|screensize

ऐसा करके यह करते हुए आपकी गतिविधि अभिविन्यास के दौरान लोड नहीं होगी परिवर्तन और आप उस समस्या का सामना नहीं करेंगे जो आप वर्तमान में सामना कर रहे हैं।

आपकी मदद कर सकता है।

1

आपका टेक्स्ट व्यू संदर्भ शून्य है। एनपीई आपके डेटपिकर फ्रैगमेंट के लाइन 39 पर है। इसकी नींद का कारण यह है कि जब अभिविन्यास बदलता है तो संपूर्ण दृश्य पदानुक्रम को फिर से बनाया जाता है, और टेक्स्टव्यू का संदर्भ जिसे आपने अपनी डेटपिकरफ्रैगमेंट में पास किया है, अब मौजूद नहीं है।

टेक्स्ट व्यू उदाहरण में गुजरने के बजाय, टेक्स्ट व्यू की आईडी में गुजरने का प्रयास करें।

new DatePickerFragment(v.getId()); 

फिर

public Bundle onSaveInstanceState() 

और

public void onRestoreInstanceState (Bundle savedInstanceState) 

बचाने के लिए और जब अपने DatePickerDialog नष्ट कर दिया और निर्मित है के लिए अपने TextView की आईडी बहाल करने के लिए लागू करते हैं।

फिर आप

getActivity().findViewById(your_text_view_ID) 

उपयोग करने के लिए दृश्य पदानुक्रम में अपने TextView उदाहरण खोजने के लिए इतना है कि आप इसे पाठ सेट कर सकते हैं की आवश्यकता होगी।

+1

मैं सहमत हूं। जब एंड्रॉइड आपके टुकड़े को पुनर्निर्माण करता है तो यह डिफ़ॉल्ट कन्स्ट्रक्टर ('सार्वजनिक डेटपिकरफ्रैगमेंट() {}') कहता है ... [दस्तावेज़ीकरण] उद्धृत करने के लिए (http://developer.android.com/reference/android/app/Fragment.html) , "टुकड़े के सभी उप-वर्गों में एक सार्वजनिक खाली कन्स्ट्रक्टर शामिल होना चाहिए। विशेष रूप से राज्य पुनर्स्थापना के दौरान ढांचे को एक खंड वर्ग को फिर से चालू कर दिया जाएगा, और इसे तुरंत स्थापित करने के लिए इस कन्स्ट्रक्टर को खोजने में सक्षम होना चाहिए।" – Sam

+0

@ एकोस सीज़: मुझे पता था कि मुझे यह क्यों मिल रहा है। मैं इस कोड को संशोधित करके इस स्थिति को दूर करना चाहता हूं। क्या आप मेरी मदद कर सकते हैं कि मैं इस टेक्स्टव्यू आईडी को खंड में कैसे पारित कर सकता हूं? –