Android 单击EditText以片段形式打开日历
我试图在点击片段内的编辑文本时打开日历。但当我点击编辑文本时,它向我抛出空指针异常。 同样的代码在Activity类中运行良好,但在Fargement中运行不正常 例外情况Android 单击EditText以片段形式打开日历,android,android-layout,android-fragments,android-calendar,Android,Android Layout,Android Fragments,Android Calendar,我试图在点击片段内的编辑文本时打开日历。但当我点击编辑文本时,它向我抛出空指针异常。 同样的代码在Activity类中运行良好,但在Fargement中运行不正常 例外情况 03-05 19:02:39.888: E/AndroidRuntime(1092): FATAL EXCEPTION: main 03-05 19:02:39.888: E/AndroidRuntime(1092): java.lang.NullPointerException 03-05 19:02:39.888: E/
03-05 19:02:39.888: E/AndroidRuntime(1092): FATAL EXCEPTION: main
03-05 19:02:39.888: E/AndroidRuntime(1092): java.lang.NullPointerException
03-05 19:02:39.888: E/AndroidRuntime(1092): at com.test.newapp.AppTrip.showDialog(AppTrip.java:75)
03-05 19:02:39.888: E/AndroidRuntime(1092): at com.test.newapp.AppTrip$2.onClick(AppTrip.java:54)
03-05 19:02:39.888: E/AndroidRuntime(1092): at android.view.View.performClick(View.java:4212)
03-05 19:02:39.888: E/AndroidRuntime(1092): at android.view.View$PerformClick.run(View.java:17476)
03-05 19:02:39.888: E/AndroidRuntime(1092): at android.os.Handler.handleCallback(Handler.java:800)
03-05 19:02:39.888: E/AndroidRuntime(1092): at android.os.Handler.dispatchMessage(Handler.java:100)
03-05 19:02:39.888: E/AndroidRuntime(1092): at android.os.Looper.loop(Looper.java:194)
03-05 19:02:39.888: E/AndroidRuntime(1092): at android.app.ActivityThread.main(ActivityThread.java:5371)
03-05 19:02:39.888: E/AndroidRuntime(1092): at java.lang.reflect.Method.invokeNative(Native Method)
03-05 19:02:39.888: E/AndroidRuntime(1092): at java.lang.reflect.Method.invoke(Method.java:525)
03-05 19:02:39.888: E/AndroidRuntime(1092): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
03-05 19:02:39.888: E/AndroidRuntime(1092): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
03-05 19:02:39.888: E/AndroidRuntime(1092): at dalvik.system.NativeStart.main(Native Method)
片段代码
public class AppTrip extends Fragment {
View rootView;
EditText from_date, to_date;
DatePickerDialog.OnDateSetListener date;
static final int DATE_DIALOG_ID = 999;
Calendar myCalendar;
int val;
Context context;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
context = getActivity();
rootView = inflater.inflate(R.layout.main, container, false);
from_date = (EditText) rootView.findViewById(R.id.from_date);
to_date = (EditText) rootView.findViewById(R.id.to_date);
from_date.setFocusableInTouchMode(false);
to_date.setFocusableInTouchMode(false);
date = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub
myCalendar.set(Calendar.YEAR, year);
myCalendar.set(Calendar.MONTH, monthOfYear);
myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateLabel(val);
}
};
from_date.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showDialog(DATE_DIALOG_ID);
val = 1;
}
});
to_date.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog(DATE_DIALOG_ID);
val = 2;
}
});
return rootView;
}
protected Dialog showDialog(int dateDialogId) {
final Calendar now = Calendar.getInstance();
switch (dateDialogId) {
case DATE_DIALOG_ID:
DatePickerDialog _date = new DatePickerDialog(context, date,
myCalendar.get(Calendar.YEAR),
myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH)) {
@Override
public void onDateChanged(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
if (year - now.get(Calendar.YEAR) > 1) {
view.updateDate(year - 1,
myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH));
}
if (year - now.get(Calendar.YEAR) == 1
&& monthOfYear > now.get(Calendar.MONTH)) {
view.updateDate(year, myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH));
}
if (year - now.get(Calendar.YEAR) == 1
&& monthOfYear == now.get(Calendar.MONTH)
&& dayOfMonth > now.get(Calendar.DAY_OF_MONTH)) {
view.updateDate(year, myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH));
}
if (year < now.get(Calendar.YEAR))
view.updateDate(myCalendar.get(Calendar.YEAR),
myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH));
if (monthOfYear < now.get(Calendar.MONTH)
&& year == now.get(Calendar.YEAR))
view.updateDate(myCalendar.get(Calendar.YEAR),
myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH));
if (dayOfMonth < now.get(Calendar.DAY_OF_MONTH)
&& year == now.get(Calendar.YEAR)
&& monthOfYear == now.get(Calendar.MONTH))
view.updateDate(myCalendar.get(Calendar.YEAR),
myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH));
}
};
return _date;
}
return null;
}
private void updateLabel(int val) {
String myFormat = "dd/MM/yy"; // In which you need put here
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
Log.d("Date value ", "===" + sdf.format(myCalendar.getTime()));
if (val == 1)
from_date.setText(sdf.format(myCalendar.getTime()));
else
to_date.setText(sdf.format(myCalendar.getTime()));
}
}
公共类AppTrip扩展片段{
视图根视图;
EditText from_date,to_date;
DatePickerDialog.OnDateSetListener日期;
静态最终整数日期对话框ID=999;
日历我的日历;
int-val;
语境;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
context=getActivity();
rootView=充气机。充气(右布局主,容器,假);
from_date=(EditText)rootView.findviewbyd(R.id.from_date);
to_date=(EditText)rootView.findViewById(R.id.to_date);
from_date.setFocusableInTouchMode(假);
截止日期。setFocusableInTouchMode(假);
日期=新的DatePickerDialog.OnDateSetListener(){
@凌驾
公共无效onDateSet(日期选择器视图,整数年,整数月,
整数(每月的第几天){
//TODO自动生成的方法存根
myCalendar.set(Calendar.YEAR,YEAR);
myCalendar.set(Calendar.MONTH,monthOfYear);
myCalendar.set(Calendar.DAY\u OF\u MONTH,dayOfMonth);
更新标签(val);
}
};
from_date.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
showDialog(日期对话框ID);
val=1;
}
});
to_date.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
showDialog(日期对话框ID);
val=2;
}
});
返回rootView;
}
受保护的对话框showDialog(int-dateDialogId){
final Calendar now=Calendar.getInstance();
开关(日期对话框ID){
案例日期\u对话框\u ID:
DatePickerDialog\u date=新的DatePickerDialog(上下文、日期、,
myCalendar.get(Calendar.YEAR),
myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY\u OF_MONTH)){
@凌驾
公共无效onDateChanged(日期选择器视图,整数年,
int monthOfYear,int dayOfMonth){
如果(年-现在获取(日历年)>1){
视图更新日期(第1年,
myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY/u/u月));
}
if(year-now.get(Calendar.year)=1
&&monthOfYear>now.get(日历月)){
view.updateDate(year,myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY/u/u月));
}
if(year-now.get(Calendar.year)=1
&&MonthHofYear==now.get(Calendar.MONTH)
&&dayOfMonth>now.get(Calendar.DAY OfMonth)){
view.updateDate(year,myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY/u/u月));
}
如果(年<现在获取(日历年))
view.updateDate(myCalendar.get(Calendar.YEAR),
myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY/u/u月));
if(monthOfYear
从
myCalendar.get(Calendar.YEAR),
myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH))
到
在showDialog()方法中
您忘记初始化日历myCalendar
您正在使用未初始化的myCalendar实例。尝试使用“现在”而不是“我的日历”。代码中的所有内容都正常您必须在代码中进行两项更改 首先在创建视图中执行此操作
myCalendar = Calendar.getInstance();
再加上这个
_date.show();
以前
return _date;
内部片段showdialog()方法不起作用。您可以这样做,setonclicklistener from_date并在其中调用DatePickerDialog。做你在活动课上做的其他事情。。
希望这对您有所帮助。showDialog(int)方法已被弃用。使用Dialogfragment.still我得到了相同的例外情况哪一行你得到了NPE?这一行是myCalendar.get(Calendar.YEAR),在DATE\u DIALOG\u ID:check的情况下
_date.show();
return _date;