任何人都可以告诉我下面显示的代码错误是什么。尝试使用“编辑文本”打开日期选择器对话框,但显示错误无法解析方法findViewById(int)
package com.example.claire.townapp;
import java.util.Calendar;
import android.annotation.SuppressLint;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.widget.DatePicker;
import android.widget.EditText;
@SuppressLint("ValidFragment")
public class DateDialog extends DialogFragment implements
DatePickerDialog.OnDateSetListener {
EditText txtdate;
public DateDialog(View view){
txtdate=(EditText)view;
}
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the dialog
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) {
//show to the selected date in the text box
String date=day+"-"+(month+1)+"-"+year;
txtdate.setText(date);
}
public void onStart(){
super.onStart();
EditText txtDate = (EditText)findViewById(R.id.txtdate);
txtDate.setOnFocusChangeListener(new View.OnFocusChangeListener(){
public void onFocusChange(View view, boolean hasfocus){
if(hasfocus){
DateDialog dialog=new DateDialog(view);
FragmentTransaction ft =getFragmentManager().beginTransaction();
dialog.show(ft, "DatePicker");
}
}
有谁知道如何解决此错误?非常感谢任何帮助!
答案 0 :(得分:0)
你的代码无效的原因是因为findViewById(int resID)不是Fragment上的方法,就像它是Activity一样。您需要一个有效的对象(如视图)来调用findViewById()。 AlertDialogs碰巧有一个实用程序方法,允许你检查它的View类似于View的布局(事实上,在幕后它只是将调用传递给它赢得了View对象'mWindow')。获取对话框的引用,并调用findViewById()传递对所需EditText的引用。
我不相信,您的代码会起作用,因为您只是用一个片段包装DatePickerDialog,因此您无法控制布局。要小心,因为您正在使用框架类,您需要了解View的窗口内部。例如。我偷看了DataPickerDialog的源代码,我没有找到任何对id为'txtdate'或甚至是EditText的View的引用(我可能错了,看起来并不彻底)。将该值传递给findViewById(int resid),您将返回null。您还可以获得ClassCastException,如果它恰好包含具有该id但具有不同View类型的View,那么也要特别注意查看类型。
答案 1 :(得分:-1)
旧答案: 你需要一个rootview来使用findviewbyid。 使用inflate进行xml布局并获取rootview(类似于在main活动中完成的方式),然后从根视图中调用fintviewbyid,如下所示: EditText txtDate =(EditText) rootview .findViewById(R.id.txtdate);
但你不能在onStart里面做,因为还没有构建视图。你需要在 onCreateDialog 中进行。