我做了日期选择的,要有两个按钮“确认”和“取消”。
我想达到的效果是按“取消”关闭弹出的日期选择对话框,按“确认”关闭弹出的日期对话框同时把选择的日期写到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();

解决方案 »

  1.   

    你把textview=(TextView)findViewById(R.id.textview1);
            textview.setText(year+"-"+monthOfYear+"-"+dayOfMonth);放到"OK"按钮里试试
      

  2.   

    OK的单击事件里没有传入year、monthOfYear、dayOfMonth这3个参数
      

  3.   

    OK的单击事件里没有传入year、monthOfYear、dayOfMonth这3个参数
    可以在onDateSet()中将参数传出来,然后在onClick()中去处理
      

  4.   

    OK的单击事件里没有传入year、monthOfYear、dayOfMonth这3个参数
    可以在onDateSet()中将参数传出来,然后在onClick()中去处理
    这样貌似变复杂了啊,我看书上都很简单的,就是运行的效果不一样-_-;;
      

  5.   

    Android的网上的书上的很多内容好像都过时了,让人很郁闷。
      

  6.   

    抱歉,没看清。你可以加一个boolean标志位,
    @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;
                        }
                    });
      

  7.   

    用的什么书??我感觉你这demo写得有问题!
      

  8.   

    非常感谢,你这个方法可以。
    但是这样写了显得我很菜,我想DatePickerDialog应该有不借用其他外部变量解决的方法
    不知道有没有人会标准的通用的处理方法。
      

  9.   

    我的一本书上是用DatePicker控件的,是直接添加到Activity上的,而不是按某个按钮后弹出。
    我看手机上的应用都是弹出的嘛,然后我在网上找到了下面的方法。
    new DatePickerDialog(MainActivity.this, DatePickerListener, iYear, iMonth, iDay).show();
    人家这么用的时候是有“确认”和“取消”按钮的,而我用只有一个“确认”按钮。
    后来网上的一位好心人告诉我可以用setButton方法添加取消按钮。但是我加onDateSet后就出现上述的问题了。
      

  10.   

    我的一本书上是用DatePicker控件的,是直接添加到Activity上的,而不是按某个按钮后弹出。
    我看手机上的应用都是弹出的嘛,然后我在网上找到了下面的方法。
    new DatePickerDialog(MainActivity.this, DatePickerListener, iYear, iMonth, iDay).show();
    人家这么用的时候是有“确认”和“取消”按钮的,而我用只有一个“确认”按钮。
    后来网上的一位好心人告诉我可以用setButton方法添加取消按钮。但是我加onDateSet后就出现上述的问题了。
    请问你方便把你的demo代码直接发给我么,我可以帮你调下试试!!
      

  11.   

    @Override
         public void onDateSet(DatePicker view, int year, int monthOfYear,
                 int dayOfMonth) {本人理解这个方法,DatePicker 是有默认的选中值的,所以无论你确定还是取消,年,月,日都会填写在textview中的,因为你把内容填写放在这个方法里了。
    楼主如果解决了这个问题,请分享下,多谢哈!
      

  12.   

    当然可以,求之不得。activity_main.xml<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        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;
    }}
      

  13.   

    网上有人说是不管点“确认”或“取消”都会调onDateSet方法。
      

  14.   

    当然可以,求之不得。activity_main.xml<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        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;
    }}
    刚回来哈,我看看!!!
      

  15.   

    网上有人说是不管点“确认”或“取消”都会调onDateSet方法。

    这是4.1的一个bug
      

  16.   

    你好哈,那个Toast是因为你那个iYear是int型的,你加个 ( + "" )就可以了
    然后我看了那个DatePickerDialog的源码,感觉是没有什么问题,然后我换了种想法试了下,发现果然是这样
    你那个onDateSet被触发其实是在你这个“dialog”关闭的时候,它才去识别到那个日期的改变而不是在你更改“日期控件,年月日值的时候”,这样的话,其实就有个问题,你关闭掉这个dialog,不管以什么方式关闭(比如:按了“back”键,"或者触碰了屏幕的其他位置",或者按了"cancle"),肯定都会触发这个事件,而且都会在你自己设置的button的onclick执行完之后执行,所以,这就导致你只能在那个onDateSet里面写那个“视图层view”的东西了,你用这个东西虽然是方便了,但是太不灵活了,你自己随随便便布局一下,放个datePicker再自己写两个button,这样会比这个好用不知道多少!!!
      

  17.   

    dataset方法肯定会回调的。本身这个问题的思路就有问题,有些时候结果才是主要的