如何在动态生成的Button中设置特定id的文本

时间:2013-10-29 09:06:59

标签: android android-timepicker

我有以下代码。在这里我有动态生成的按钮。当单击按钮时,它会显示时间戳。我的问题是设置点击按钮的时间,但它设置了最后一个按钮的文本如何设置点击按钮的值......

public void addButton(int value) {
    list.removeAllViews();

    for (i=0 ; i < value; i++) {
        button = new Button(this);
        button.setText("Add Time");
        button.setId(i);

        button.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                Calendar mCalendar = Calendar.getInstance();
                new TimePickerDialog(MedInfo.this, onTimeListener, mCalendar
                        .get(Calendar.HOUR_OF_DAY), mCalendar.get(Calendar.MINUTE), false)
                        .show();
                btn_cnt = v.getId();
                Toast.makeText(getApplicationContext(), ""+btn_cnt, Toast.LENGTH_SHORT).show();
            }
        });
        list.addView(button);
    }
}


TimePickerDialog.OnTimeSetListener onTimeListener = new OnTimeSetListener() {

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        String AM_PM;
        Calendar mCalendar = Calendar.getInstance();
        if (hourOfDay < 12) {
            AM_PM = "AM";

        } else {
            AM_PM = "PM";

        }

        long start_time = DateTimeUtils.getTimeInMillis(hourOfDay, minute, 0);
        Calendar calendar = Calendar.getInstance();

        long mseconds = DateTimeUtils.getFirstMillis(calendar.get(Calendar.DATE),
                calendar.get(Calendar.MONTH), calendar.get(Calendar.YEAR));
        time = start_time + mseconds;

        button.settext(time);
        mCalendar.set(Calendar.HOUR, hourOfDay);
        mCalendar.set(Calendar.MINUTE, minute);

    }
};

任何帮助都会很明显......

编辑:

错误日志:

10-29 15:07:32.478: E/AndroidRuntime(6401): FATAL EXCEPTION: main
10-29 15:07:32.478: E/AndroidRuntime(6401): java.lang.NullPointerException
10-29 15:07:32.478: E/AndroidRuntime(6401):     at com.example.medicationreminder.MedInfo$MyOnTimeSetListenter.onTimeSet(MedInfo.java:237)
10-29 15:07:32.478: E/AndroidRuntime(6401):     at android.app.TimePickerDialog.tryNotifyTimeSet(TimePickerDialog.java:130)
10-29 15:07:32.478: E/AndroidRuntime(6401):     at android.app.TimePickerDialog.onClick(TimePickerDialog.java:115)

3 个答案:

答案 0 :(得分:2)

一种可能的解决方案是实现一个自定义OnTimeSetListener,它可以保持对点击按钮的引用。在显示时间选择器之前,请通知自定义侦听器单击了哪个按钮。请参阅以下代码:

public void addButton(int value) {
    list.removeAllViews();

    for (i=0 ; i < value; i++) {
        button = new Button(this);
        button.setText("Add Time");
        button.setId(i);

        button.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                Calendar mCalendar = Calendar.getInstance();
                // set the button which was clicked
                onTimeListener.setClickedButton((Button)v);
                new TimePickerDialog(this, onTimeListener, mCalendar
                        .get(Calendar.HOUR_OF_DAY), mCalendar.get(Calendar.MINUTE), false)
                        .show();
                btn_cnt = v.getId();
                Toast.makeText(getApplicationContext(), ""+btn_cnt, Toast.LENGTH_SHORT).show();
            }
        });
        list.addView(button);
    }
}

TimePickerDialog.OnTimeSetListener onTimeListener = new MyOnTimeSetListenter();

class MyOnTimeSetListenter implements TimePickerDialog.OnTimeSetListener {

    private Button button;

    public void setClickedButton(Button button) {
        this.button = button;
    }

    @Override
    public void onTimeSet(TimePicker timePicker, int i, int i2) {
        String AM_PM;
        Calendar mCalendar = Calendar.getInstance();
        if (hourOfDay < 12) {
            AM_PM = "AM";

        } else {
            AM_PM = "PM";

        }

        long start_time = DateTimeUtils.getTimeInMillis(hourOfDay, minute, 0);
        Calendar calendar = Calendar.getInstance();

        long mseconds = DateTimeUtils.getFirstMillis(calendar.get(Calendar.DATE),
                calendar.get(Calendar.MONTH), calendar.get(Calendar.YEAR));
        time = start_time + mseconds;

        this.button.settext(time);
        mCalendar.set(Calendar.HOUR, hourOfDay);
        mCalendar.set(Calendar.MINUTE, minute);
    }
}

答案 1 :(得分:2)

尝试更新特定按钮的文字

Button b=(Button)list.getChildAt(btn_cnt);
b.settext(time);

当您将Button Id存储在 btn_cnt 中时,可以使用getChildAt(position)

获取视图

列表是您添加Layout的{​​{1}}。

Button dynamically

修改: - 您可以使用public void addButton(int value) { list.removeAllViews(); for (i=0 ; i < value; i++) { button = new Button(this); button.setText("Add Time"); button.setId(i); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { Calendar mCalendar = Calendar.getInstance(); new TimePickerDialog(MedInfo.this, onTimeListener, mCalendar .get(Calendar.HOUR_OF_DAY), mCalendar.get(Calendar.MINUTE), false) .show(); btn_cnt = v.getId(); Toast.makeText(getApplicationContext(), ""+btn_cnt, Toast.LENGTH_SHORT).show(); } }); list.addView(button); } } TimePickerDialog.OnTimeSetListener onTimeListener = new OnTimeSetListener() { public void onTimeSet(TimePicker view, int hourOfDay, int minute) { String AM_PM; Calendar mCalendar = Calendar.getInstance(); if (hourOfDay < 12) { AM_PM = "AM"; } else { AM_PM = "PM"; } long start_time = DateTimeUtils.getTimeInMillis(hourOfDay, minute, 0); Calendar calendar = Calendar.getInstance(); long mseconds = DateTimeUtils.getFirstMillis(calendar.get(Calendar.DATE), calendar.get(Calendar.MONTH), calendar.get(Calendar.YEAR)); time = start_time + mseconds; Button b=(Button)list.getChildAt(btn_cnt); b.settext(time); mCalendar.set(Calendar.HOUR, hourOfDay); mCalendar.set(Calendar.MINUTE, minute); } }; 代替List从Button中检索所有时间。

Array

希望这会对你有所帮助。

答案 2 :(得分:0)

只需创建一个全局变量并在timeListener上设置其值,并在需要时设置setText(global_variable)