【问题标题】:How to set the text at particular id in dynamic generated Button如何在动态生成的按钮中设置特定 id 的文本
【发布时间】:2013-10-29 09:06:58
【问题描述】:

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

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)

【问题讨论】:

    标签: android android-timepicker


    【解决方案1】:

    尝试更新特定按钮的文本

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

    由于您将Button Id 存储在btn_cnt 中,因此可以使用getChildAt(position) 获取视图

    list 是您的Layout,您在其中添加了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 而不是 Array 来一直从 Button 检索。

    List<String> listOfDate=new ArrayList<String>();
            for(int i=0;i<list.getChildCount();i++)
            {
                Button b=(Button)list.getChildAt(i);
                listOfDate.add(b.getText().toString());
    
            }
    

    希望这会对你有所帮助。

    【讨论】:

    • 这显示了这个错误... 语法错误,插入“AssignmentOperator Expression”以完成赋值 - 语法错误,插入“;”完成声明
    • @Arut 按钮 b=(Button)list.getChildAt(btn_cnt); b.settext(时间);试试这样。
    • @Arut 当然,你可以问.. 我会尽力帮助你的。
    • 在上面的一个中,我想获得每个按钮的时间..我使用数组得到的值很好还是使用其他方式..
    • 我没有使用按钮的gettext,因为我将时间转换成其他格式...
    【解决方案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);
        }
    }
    

    【讨论】:

    • 在创建对话框时使用 MediaInfo.this new TimePickerDialog。使用ContextActivitythis,具体取决于您的代码在活动中的位置。
    【解决方案3】:

    只需创建一个全局变量并将其值设置为 onTimeListener 并在需要时设置 setText(global_variable)

    【讨论】:

    • 一旦你有了时间值,你可以在页面的任何控件上设置它,使按钮声明也全局,然后尝试
    • 我的按钮是动态按钮。我想你不明白我的问题。
    • 我有时间价值..问题是我想为动态生成的按钮设置不同的时间...
    猜你喜欢
    • 2014-09-05
    • 2022-11-22
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多