2

次のコードがあります。これで、ボタンを動的に生成しました。ボタンをクリックすると、タイムピッカーが表示されます。私の問題は、クリックされたボタンの時間を設定することですが、クリックされたボタンで値を設定する方法を最後のボタンにテキストを設定します...

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)
4

3 に答える 3

2

特定のボタンのテキストを更新したい

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

btn_cntに保存しているButton Idので、ビューを取得できますgetChildAt(position)

where 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

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());

        }

これがあなたを助けることを願っています。

于 2013-10-29T09:33:53.563 に答える
2

OnTimeSetListener考えられる解決策の 1 つは、クリックされたボタンへの参照を保持できるカスタムを実装することです。タイム ピッカーを表示する前に、クリックされたボタンをカスタム リスナーに通知します。以下のコードを参照してください。

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);
    }
}
于 2013-10-29T09:26:38.573 に答える
0

グローバル変数を作成し、その値を onTimeListener に設定し、必要に応じて setText(global_variable) を設定するだけです

于 2013-10-29T09:34:26.947 に答える