无法解析方法findViewById(int) - 编辑文本到日期选择器

时间:2017-12-05 16:47:09

标签: android xml android-studio findviewbyid

任何人都可以告诉我下面显示的代码错误是什么。尝试使用“编辑文本”打开日期选择器对话框,但显示错误无法解析方法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");





    }
}

有谁知道如何解决此错误?非常感谢任何帮助!

2 个答案:

答案 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)

抱歉,我不明白你之前想做什么。 你想在编辑文本处于焦点时打开对话框(我不建议 - 更好的选择是使用onclick但是问题是:)。 您在onstart中编写的所有内容都不应该在对话框类中,而是在包含编辑文本的片段或活动中。 (看看我的旧答案,看看为什么不把它放在onStart的相关活动或片段中,而是把它放在onCreate中)。

旧答案: 你需要一个rootview来使用findviewbyid。 使用inflate进行xml布局并获取rootview(类似于在main活动中完成的方式),然后从根视图中调用fintviewbyid,如下所示: EditText txtDate =(EditText) rootview .findViewById(R.id.txtdate);

但你不能在onStart里面做,因为还没有构建视图。你需要在 onCreateDialog 中进行。