3

カスタム AlertDialog (実際には、カスタム TimePickerDialog) をセットアップしました。条件に従ってボタンのテキストを更新するために、OnShowListener を使用しています。このコードを別のメソッドに配置しました。

private void changeState(){
    if(!SleepAlarm.isActive()){
        Log.d("RPod_MainActivity","SleepAlarm is NOT active");
        this.setButton(TimePickerDialog.BUTTON1,(CharSequence)MainActivity.currentContext.getResources().getText(R.string.sleep_enable), sleepEnable);
        this.setButton(TimePickerDialog.BUTTON2,(CharSequence)MainActivity.currentContext.getResources().getText(R.string.sleep_cancel), sleepDisable);
    }
    else{
        Log.d("RPod_MainActivity","SleepAlarm is active");
        this.setButton(TimePickerDialog.BUTTON1,(CharSequence)MainActivity.currentContext.getResources().getText(R.string.sleep_change), sleepEnable);
        this.setButton(TimePickerDialog.BUTTON2,(CharSequence)MainActivity.currentContext.getResources().getText(R.string.sleep_disable), sleepDisable);
    }
    this.setTitle(R.string.sleep_title);
}

TimePickerDialog.BUTTON1 ボタンを押した後、もう一度ダイアログを表示すると、条件が満たされ、テキストが変更されます。しかし、そうではありません。

状態が問題ないことを LogCat で確認しました。初めてダイアログを開くと、「SleepAlarm is not active」と表示されます。最初のボタンを押して、もう一度ダイアログを開くと、「SleepAlarm is active」と表示されます...しかし、ボタンのテキストは同じです!

文字列は次のとおりです。

<string name="sleep_enable">Enable</string>
<string name="sleep_disable">Disable</string>
<string name="sleep_cancel">Cancel</string>
<string name="sleep_change">Change</string>

編集:このコードを使用してダイアログを作成しました:

showDialog(TIME_DIALOG_ID);

onCreateDialog の実装:

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case TIME_DIALOG_ID:
        // set time picker as current time
        timePicker = new SleepPickerDialog(this,this);
        return timePicker;
    }
    return null;
}

そして、SleepPickerDialog (TimePickerDialog を拡張) コンストラクター:

public SleepPickerDialog(Context context, OnTimeSetListener listener){
    super(context, listener, MainActivity.sleep_hour, MainActivity.sleep_hour, true);
    changeState();
    this.setOnShowListener(showListener);
}

アルゴリズム、onShowListener:

private DialogInterface.OnShowListener showListener = new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        // Cambiar botones
        changeState();
    }
};

私は何か重要なものを見逃していますか?

解決策については、受け入れられた回答のコメントを参照してください。ここに完全なコード変更を投稿しています:

public SleepPickerDialog(Context context, OnTimeSetListener listener){
    super(context, listener, MainActivity.sleep_hour, MainActivity.sleep_hour, true);
    this.setButton(BUTTON_POSITIVE,(CharSequence)MainActivity.currentContext.getResources().getText(R.string.sleep_enable), sleepEnable);
    this.setButton(BUTTON_NEGATIVE,(CharSequence)MainActivity.currentContext.getResources().getText(R.string.sleep_cancel), sleepDisable);
    this.setOnShowListener(showListener);
}


private void changeState(){
    if(!SleepAlarm.isActive()){
        this.getButton(BUTTON_POSITIVE).setText(R.string.sleep_enable);
        this.getButton(BUTTON_NEGATIVE).setText(R.string.sleep_cancel);
    }
    else{
        this.getButton(BUTTON_POSITIVE).setText(R.string.sleep_change);
        this.getButton(BUTTON_NEGATIVE).setText(R.string.sleep_disable);
    }
    this.setTitle(R.string.sleep_title);
}
4

1 に答える 1

3

これに従ってこのリンクを参照してくださいそれは動作します

試す

yourTimePickerDialog.getButton(whichButton).setText("New Text"); (put the null check if needed)

or 

yourTimePickerDialog.setButton(BUTTON_POSITIVE, "Find", yourTimePickerDialog);
于 2012-06-24T11:53:29.243 に答える