2013-04-13 40 views
12

Tôi đang cố gắng phát triển một datepicker đặt giá trị của một textview khi thiết lập.Android findViewById trong DialogFragment

Nhưng tôi không thể chọn TV từ DialogFragment xử lý datepicker.

Tôi đã thử getView() nhưng ứng dụng gặp sự cố tại điểm cụ thể.

Dưới đây là mã của tôi:

import java.util.Calendar; 

import android.annotation.SuppressLint; 
import android.app.DatePickerDialog; 
import android.app.Dialog; 
import android.app.DialogFragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.DatePicker; 
import android.widget.TextView; 

@SuppressLint("NewApi") 
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { 

TextView mTextView; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

      // R.layout.my_layout - that's the layout where your textview is placed 
    View view = inflater.inflate(R.layout.activity_register_screen, container, false); 
    mTextView = (TextView) view.findViewById(R.id.tvDate); 
    // you can use your textview. 
    return view; 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    // Use the current date as the default date in the picker 
    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); 

    // Create a new instance of DatePickerDialog and return it 
    return new DatePickerDialog(getActivity(), this, year, month, day); 
} 

public void onDateSet(DatePicker view, int year, int month, int day) { 
    int syear = year; 
    int smonth = month; 
    int sday = day; 
    // set selected date into textview 
    mTextView.setText(new StringBuilder().append(smonth + 1) 
     .append("-").append(sday).append("-").append(syear) 
     .append(" ")); 
} 

}

Cảm ơn, bất kỳ trợ giúp sẽ được đánh giá cao.

cập nhật với mã mới và các lỗi sau:

04-15 09:45:30.880: E/AndroidRuntime(23016): FATAL EXCEPTION: main 
04-15 09:45:30.880: E/AndroidRuntime(23016): android.util.AndroidRuntimeException: requestFeature() must be called before adding content 
04-15 09:45:30.880: E/AndroidRuntime(23016): at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:239) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at com.android.internal.app.AlertController.installContent(AlertController.java:236) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at android.app.AlertDialog.onCreate(AlertDialog.java:336) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at android.app.Dialog.dispatchOnCreate(Dialog.java:353) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at android.app.Dialog.show(Dialog.java:257) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at android.app.DialogFragment.onStart(DialogFragment.java:490) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at android.app.Fragment.performStart(Fragment.java:1537) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:866) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1036) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at android.app.BackStackRecord.run(BackStackRecord.java:622) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1386) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:430) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at android.os.Handler.handleCallback(Handler.java:605) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at android.os.Handler.dispatchMessage(Handler.java:92) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at android.os.Looper.loop(Looper.java:137) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at android.app.ActivityThread.main(ActivityThread.java:4517) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at java.lang.reflect.Method.invokeNative(Native Method) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at java.lang.reflect.Method.invoke(Method.java:511) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 
04-15 09:45:30.880: E/AndroidRuntime(23016): at dalvik.system.NativeStart.main(Native Method) 

SOLVED

+0

Có phải 'tvDate' trong phân đoạn khác không? – Sam

+0

tvDate nằm trong một Hoạt động –

+1

Vui lòng kiểm tra câu trả lời của tôi về chuỗi này. http://stackoverflow.com/questions/16507016/findviewbyid-in-dialogfragment-nullpointerexception/29291399#29291399 Cheers! – noahutz

Trả lời

21

Để có được một cái nhìn cụ thể trong Fragment/Fragment thoại bạn nên sử dụng onCreateView(). Dưới đây là một ví dụ làm thế nào để làm điều đó:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    // R.layout.my_layout - that's the layout where your textview is placed 
    View view = inflater.inflate(R.layout.my_layout, container, false); 
    TextView mTextView = (TextView) view.findViewById(R.id.colors); 
    // you can use your textview. 
    return view; 
} 

Kiểm tra đầu tiên nếu onCreateDialog() được gọi trước khi onCreateView() và nếu đó là sự thật cố gắng sử dụng một cái gì đó như thế này:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    // Use the Builder class for convenient dialog construction 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    View view = inflater.inflate(R.layout. activity_register_screen, null); 
    builder.setView(view); 
    // Create the AlertDialog object and return it 
    return builder.create(); 
} 
+0

Tôi đã thử điều này, nhưng bây giờ ứng dụng bị treo khi nó bắt đầu tải datepicker. –

+0

cập nhật câu trả lời của bạn theo cách bạn đang sử dụng và sự cố – hardartcore

+0

ok, được cập nhật bằng mã và lỗi. –

1

Có cách đơn giản hơn để tìm xem trong DialogFragment.

@Override 
public void onStart() { 
    super.onStart(); 
    mTextView = (TextView) getDialog().findViewById(R.id.tvDate); 
} 
Các vấn đề liên quan