我做了日期选择的,要有两个按钮“确认”和“取消”。
我想达到的效果是按“取消”关闭弹出的日期选择对话框,按“确认”关闭弹出的日期对话框同时把选择的日期写到textview中。
但是现在不管我按“取消”还是“确认”,日期都会写到textview中。怎么解决?
“取消”和“确认”的单击事件跟onDateSet有什么关联?
还有如果我在onDateSet中写toast弹出信息汇报“Unfortunately,test01 has stopped.”错,这又是为什么呢?
private DatePickerDialog.OnDateSetListener DatePickerListener = new DatePickerDialog.OnDateSetListener(){ @Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub
textview=(TextView)findViewById(R.id.textview1);
textview.setText(year+"-"+monthOfYear+"-"+dayOfMonth);
}
}; DatePickerDialog picker = new DatePickerDialog(MainActivity.this, DatePickerListener,
iYear, iMonth, iDay);
picker.setCancelable(true);
picker.setCanceledOnTouchOutside(true);
picker.setButton(DialogInterface.BUTTON_POSITIVE, "OK",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.d("Picker", "Correct behavior!");
}
});
picker.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.d("Picker", "Cancel!");
}
});
picker.show();
我想达到的效果是按“取消”关闭弹出的日期选择对话框,按“确认”关闭弹出的日期对话框同时把选择的日期写到textview中。
但是现在不管我按“取消”还是“确认”,日期都会写到textview中。怎么解决?
“取消”和“确认”的单击事件跟onDateSet有什么关联?
还有如果我在onDateSet中写toast弹出信息汇报“Unfortunately,test01 has stopped.”错,这又是为什么呢?
private DatePickerDialog.OnDateSetListener DatePickerListener = new DatePickerDialog.OnDateSetListener(){ @Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub
textview=(TextView)findViewById(R.id.textview1);
textview.setText(year+"-"+monthOfYear+"-"+dayOfMonth);
}
}; DatePickerDialog picker = new DatePickerDialog(MainActivity.this, DatePickerListener,
iYear, iMonth, iDay);
picker.setCancelable(true);
picker.setCanceledOnTouchOutside(true);
picker.setButton(DialogInterface.BUTTON_POSITIVE, "OK",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.d("Picker", "Correct behavior!");
}
});
picker.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.d("Picker", "Cancel!");
}
});
picker.show();
textview.setText(year+"-"+monthOfYear+"-"+dayOfMonth);放到"OK"按钮里试试
可以在onDateSet()中将参数传出来,然后在onClick()中去处理
可以在onDateSet()中将参数传出来,然后在onClick()中去处理
这样貌似变复杂了啊,我看书上都很简单的,就是运行的效果不一样-_-;;
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub
if(flag){
textview=(TextView)findViewById(R.id.textview1);
textview.setText(year+"-"+monthOfYear+"-"+dayOfMonth);
}
}
picker.setButton(DialogInterface.BUTTON_POSITIVE, "OK",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.d("Picker", "Correct behavior!");
flag = true;
}
});
picker.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.d("Picker", "Cancel!");
flag = false;
}
});
但是这样写了显得我很菜,我想DatePickerDialog应该有不借用其他外部变量解决的方法
不知道有没有人会标准的通用的处理方法。
我看手机上的应用都是弹出的嘛,然后我在网上找到了下面的方法。
new DatePickerDialog(MainActivity.this, DatePickerListener, iYear, iMonth, iDay).show();
人家这么用的时候是有“确认”和“取消”按钮的,而我用只有一个“确认”按钮。
后来网上的一位好心人告诉我可以用setButton方法添加取消按钮。但是我加onDateSet后就出现上述的问题了。
我看手机上的应用都是弹出的嘛,然后我在网上找到了下面的方法。
new DatePickerDialog(MainActivity.this, DatePickerListener, iYear, iMonth, iDay).show();
人家这么用的时候是有“确认”和“取消”按钮的,而我用只有一个“确认”按钮。
后来网上的一位好心人告诉我可以用setButton方法添加取消按钮。但是我加onDateSet后就出现上述的问题了。
请问你方便把你的demo代码直接发给我么,我可以帮你调下试试!!
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {本人理解这个方法,DatePicker 是有默认的选中值的,所以无论你确定还是取消,年,月,日都会填写在textview中的,因为你把内容填写放在这个方法里了。
楼主如果解决了这个问题,请分享下,多谢哈!
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" /></RelativeLayout>
MainActivity.javapackage com.example.test01;import java.util.Calendar;import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.DatePicker;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity {
private NotificationManager notificationmanager;
private Notification notification;
private TextView textview;
private DatePickerDialog.OnDateSetListener DatePickerListener = new DatePickerDialog.OnDateSetListener(){ @Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub textview=(TextView)findViewById(R.id.textview1);
textview.setText(year+"-"+monthOfYear+"-"+dayOfMonth);
//使用下面的Toast程序会退出,不解。
//Toast.makeText(getApplicationContext(), year,Toast.LENGTH_SHORT).show(); }
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Calendar objTime = Calendar.getInstance();
int iYear = objTime.get(Calendar.YEAR);
int iMonth = objTime.get(Calendar.MONTH);
int iDay = objTime.get(Calendar.DAY_OF_MONTH);
//new DatePickerDialog(MainActivity.this, DatePickerListener, iYear, iMonth, iDay).show();
DatePickerDialog picker = new DatePickerDialog(MainActivity.this, DatePickerListener,
iYear, iMonth, iDay);
picker.setCancelable(true);
picker.setCanceledOnTouchOutside(true);
picker.setButton(DialogInterface.BUTTON_POSITIVE, "OK",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.d("Picker", "Correct behavior!");
}
});
picker.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.d("Picker", "Cancel!");
}
});
picker.show();
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}}
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" /></RelativeLayout>
MainActivity.javapackage com.example.test01;import java.util.Calendar;import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.DatePicker;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity {
private NotificationManager notificationmanager;
private Notification notification;
private TextView textview;
private DatePickerDialog.OnDateSetListener DatePickerListener = new DatePickerDialog.OnDateSetListener(){ @Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub textview=(TextView)findViewById(R.id.textview1);
textview.setText(year+"-"+monthOfYear+"-"+dayOfMonth);
//使用下面的Toast程序会退出,不解。
//Toast.makeText(getApplicationContext(), year,Toast.LENGTH_SHORT).show(); }
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Calendar objTime = Calendar.getInstance();
int iYear = objTime.get(Calendar.YEAR);
int iMonth = objTime.get(Calendar.MONTH);
int iDay = objTime.get(Calendar.DAY_OF_MONTH);
//new DatePickerDialog(MainActivity.this, DatePickerListener, iYear, iMonth, iDay).show();
DatePickerDialog picker = new DatePickerDialog(MainActivity.this, DatePickerListener,
iYear, iMonth, iDay);
picker.setCancelable(true);
picker.setCanceledOnTouchOutside(true);
picker.setButton(DialogInterface.BUTTON_POSITIVE, "OK",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.d("Picker", "Correct behavior!");
}
});
picker.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.d("Picker", "Cancel!");
}
});
picker.show();
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}}
刚回来哈,我看看!!!
这是4.1的一个bug
然后我看了那个DatePickerDialog的源码,感觉是没有什么问题,然后我换了种想法试了下,发现果然是这样
你那个onDateSet被触发其实是在你这个“dialog”关闭的时候,它才去识别到那个日期的改变而不是在你更改“日期控件,年月日值的时候”,这样的话,其实就有个问题,你关闭掉这个dialog,不管以什么方式关闭(比如:按了“back”键,"或者触碰了屏幕的其他位置",或者按了"cancle"),肯定都会触发这个事件,而且都会在你自己设置的button的onclick执行完之后执行,所以,这就导致你只能在那个onDateSet里面写那个“视图层view”的东西了,你用这个东西虽然是方便了,但是太不灵活了,你自己随随便便布局一下,放个datePicker再自己写两个button,这样会比这个好用不知道多少!!!