2013-01-04 15 views
5

mam aktywny i wszystko czego chcę toSiła blisko przy zmianie orientacji otwarcia Data DialogueFragment

aktywny -> OnClick jakiegoś układu (To ma TextView) -> Otwórz Datepicker -> zestaw wybrana wartość w txtvalue

Chcę aceess Datepicker za pomocą DialogFragment z poniższym kodem.

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 
    } 
} 

Powyższy kod Drobny, gdy urządzenie nie zmienia swojej orientacji. Ale kiedy Datepicker jest pokazane i zmian orientacji otrzymuję siłę blisko jak Poniżej

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) 

Oto mój sposób na wywołanie DatePickerFragment

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

Proszę mi pomóc wydostać się z tego. Dzięki z góry.

Odpowiedz

3

Nie jestem pewien, że to rozwiązanie działa dla Ciebie, ale możesz go wypróbować.

Problem, przed którym stoisz, ponieważ Twoja aktywność jest ponownie ładowana za każdym razem, gdy zmienia się orientacja. możesz wywołać metodę OnConfigurationchanged(), a wewnątrz pliku Zawiadomienia możesz ustawić Configuchanges na orientation|screensize

Wykonując tę ​​czynność, twoja aktywność nie zostanie załadowana podczas zmiany orientacji, a nie będziesz mógł dłużej stawić czoła problemowi, przed którym się obecnie znajdujesz.

Może Ci pomóc.

1

Twój odnośnik TextView ma wartość NULL. NPE znajduje się w linii 39 pliku DatePickerFragment. Powód jest zerowy, ponieważ po zmianie orientacji cała hierarchia widoków jest odtwarzana, a odwołanie do TextView, który przekazałeś do DatePickerFragment, już nie istnieje.

Zamiast podawać w instancji TextView, spróbuj podać identyfikator aplikacji TextView.

new DatePickerFragment(v.getId()); 

Następnie wdrożyć

public Bundle onSaveInstanceState() 

i

public void onRestoreInstanceState (Bundle savedInstanceState) 

aby zapisać i przywrócić identyfikator dla Twojego TextView gdy DatePickerDialog jest zniszczony i odtworzony.

Będziesz wtedy musiał użyć

getActivity().findViewById(your_text_view_ID) 

znaleźć instancji TextView w hierarchii widoku, dzięki czemu można ustawić to tekst.

+1

Zgadzam się. Kiedy Android odbuduje twój fragment, wywołuje domyślny konstruktor ('public DatePickerFragment() {}') ... Aby zacytować [dokumentację] (http://developer.android.com/reference/android/app/Fragment.html) , "Wszystkie podklasy Fragmentu muszą zawierać publiczny pusty konstruktor, który w razie potrzeby często odtwarza klasę fragmentów, w szczególności podczas przywracania stanu, i musi być w stanie znaleźć ten konstruktor, aby go utworzyć." – Sam

+0

@Akos Cz: Wiedziałem, dlaczego to rozumiem. Chcę przezwyciężyć tę sytuację, modyfikując ten kod. Czy możesz mi pomóc, jak mogę przekazać ten tekstowy tekst do fragmentu? –

Powiązane problemy