2013-01-04 19 views
5

Tôi có một hoạt động và tất cả tôi muốn làForce gần khi thay đổi định hướng với mở ngày DialogueFragment

Hoạt động -> OnClick của một số bố trí (Đó có TextView) -> Open datepicker -> bộ giá trị được chọn trong txtvalue

tôi muốn aceess Datepicker Sử dụng DialogFragment with Below Code.

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

Mã trên Đã hoạt động tốt khi Thiết bị không thay đổi hướng của nó. Nhưng Khi datepicker được hiển thị và thay đổi định hướng tôi đang nhận được lực lượng gần như Dưới

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) 

Đây là phương pháp của tôi để gọi DatePickerFragment

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

Xin hãy giúp tôi thoát ra khỏi đây. Cảm ơn trước.

Trả lời

3

Tôi không chắc chắn Giải pháp này Làm việc cho bạn nhưng bạn có thể dùng thử.

Sự cố bạn đang gặp phải do Hoạt động của bạn tải lại mỗi lần thay đổi hướng của bạn. bạn có thể gọi phương thức OnConfigurationchanged() và bên trong tệp Menifest bạn có thể đặt Configuchanges thành orientation|screensize

Bằng cách thực hiện thao tác này sẽ không tải khi định hướng Thay đổi và bạn sẽ không gặp phải vấn đề hiện tại đang đối mặt.

Có thể giúp bạn.

1

Tham chiếu TextView của bạn là rỗng. NPE nằm trên dòng 39 của DatePickerFragment của bạn. Lý do null của nó là bởi vì khi định hướng thay đổi toàn bộ hệ thống phân cấp xem được tái tạo, và tham chiếu đến TextView mà bạn đã chuyển vào DatePickerFragment của bạn không còn tồn tại nữa.

Thay vì truyền trong phiên bản TextView, hãy thử chuyển vào ID của TextView.

new DatePickerFragment(v.getId()); 

Sau đó thực hiện

public Bundle onSaveInstanceState() 

public void onRestoreInstanceState (Bundle savedInstanceState) 

để lưu và khôi phục lại ID của TextView của mình khi DatePickerDialog của bạn bị phá hủy và tái tạo.

Sau đó bạn sẽ cần phải sử dụng

getActivity().findViewById(your_text_view_ID) 

để tìm dụ TextView của mình trong hệ thống phân cấp xem để bạn có thể thiết lập nó là văn bản.

+1

Tôi đồng ý. Khi Android xây dựng lại đoạn của bạn, nó gọi hàm tạo mặc định ('public DatePickerFragment() {}') ... Để trích dẫn [tài liệu] (http://developer.android.com/reference/android/app/Fragment.html) "Tất cả các lớp con của Fragment phải bao gồm một constructor trống công khai. Khung thường sẽ tái khởi tạo một lớp phân đoạn khi cần thiết, đặc biệt trong quá trình khôi phục trạng thái, và cần có khả năng tìm ra hàm khởi tạo này để khởi tạo nó." – Sam

+0

@Akos Cz: Tôi biết lý do tại sao tôi nhận được điều này. Tôi muốn khắc phục tình trạng này bằng cách sửa đổi mã này. Bạn có thể giúp tôi làm cách nào tôi có thể chuyển id văn bản này sang phân đoạn không? –

Các vấn đề liên quan