Метод добавления не работает в StringBuilder

Я пытаюсь создать небольшой виджет калькулятора, но не могу объединить входную строку с помощью StringBuilder, потому что виджет при каждом нажатии на кнопку отображает только строку, соответствующую нажатой кнопке.

Кажется, что метод добавления в StringBuilder не работает. Не могли бы вы помочь мне?

Вот соответствующие части кода:

StringBuilder sb  = new StringBuilder();
@Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();

    Log.i(LOG_TAG, "onReceive(): " + action);
    if (ACTION_WIDGET_CONTROL.equals(action)) {
        final int appWidgetId = intent.getIntExtra(
                AppWidgetManager.EXTRA_APPWIDGET_ID,
                AppWidgetManager.INVALID_APPWIDGET_ID);
        if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
            fnHandleCommand(context, intent, appWidgetId);
        }
    } else {
        super.onReceive(context, intent);
    }
}

private void fnHandleCommand(Context context, Intent intent, int appWidgetId) {
    int control_id = intent.getIntExtra(COMMAND, -1);

    switch (control_id) {
    case R.id.Button00:
        String zero = "0";
        sb.append(zero);
        setInputText(context, appWidgetId,sb.toString());
        break;
    case R.id.Button01:
        String uno = "1";
        sb.append(uno);
        setInputText(context, appWidgetId,sb.toString());
        break;
    case R.id.Button02:
        String due = "2";
        sb.append(due);
        setInputText(context, appWidgetId,sb.toString());
        break;
    case R.id.Button03:
        String tre = "3";
        sb.append(tre);
        setInputText(context, appWidgetId,sb.toString());
        break;
    case R.id.Button04:
        String quattro = "4";
        sb.append(quattro);
        setInputText(context, appWidgetId,sb.toString());
        break;
    case R.id.Button05:
        String cinque = "5";
        sb.append(cinque);
        setInputText(context, appWidgetId,sb.toString());
        break;
    case R.id.Button06:
        String sei = "6";
        sb.append(sei);
        setInputText(context, appWidgetId,sb.toString());
        break;
    case R.id.Button07:
        String sette = "7";
        sb.append(sette);
        setInputText(context, appWidgetId,sb.toString());
        break;
    case R.id.Button08:
        String otto = "8";
        sb.append(otto);
        setInputText(context, appWidgetId,sb.toString());
        break;
    case R.id.Button09:
        String nove = "9";
        sb.append(nove);
        setInputText(context, appWidgetId,sb.toString());
        break;
    case R.id.ButtonPlus:
        String piu = "+";
        sb.append(piu);
        setInputText(context, appWidgetId,sb.toString());
        break;
    case R.id.ButtonMinus:
        String meno = "-";
        sb.append(meno);
        setInputText(context, appWidgetId,sb.toString());
        break;
    case R.id.ButtonMutiple:
        String per = "*";
        sb.append(per);
        setInputText(context, appWidgetId,sb.toString());
        break;
    case R.id.ButtonDivide:
        String diviso = "/";
        sb.append(diviso);
        setInputText(context, appWidgetId,sb.toString());
        break;
    case R.id.ButtonNegative:
        String rad = "\u221a";
        sb.append(rad);
        setInputText(context, appWidgetId,sb.toString());
        break;
    case R.id.ButtonAC: 
        String vuota = "";
        sb.setLength(0);
        cancel(context, appWidgetId,sb.toString(),vuota);
        break;
    default:
        break;
    }
    fnVibrate(context);
}

private void setInputText(Context context, int appWidgetId, String value) {
    RemoteViews remoteView = new RemoteViews(context.getPackageName(),
            R.layout.simple_calculator);
    remoteView.setTextViewText(R.id.TextValue, value);
    AppWidgetManager.getInstance(context).updateAppWidget(appWidgetId,
            remoteView);
}

Спасибо


person user1480020    schedule 31.01.2014    source источник
comment
Вы пробовали отлаживать его? Вероятность того, что StringBuilder.append не работает, намного меньше, чем вероятность того, что проблема возникнет где-то еще... Я подозреваю, что вы обнаружите, что какой-то фрагмент кода, который вы не опубликовали, очищает StringBuilder между кликами. . Зарегистрируйте (или проверьте с помощью отладчика) значение sb в начале fnHandleCommand.   -  person Jon Skeet    schedule 31.01.2014
comment
а какая у тебя проблема?   -  person hoaz    schedule 31.01.2014
comment
кажется, что stringbuilder инициализируется при каждом клике   -  person user1480020    schedule 31.01.2014


Ответы (1)


private static StringBuilder sb = new StringBuilder();

person Autocrab    schedule 31.01.2014
comment
Итак, теперь StringBuilder используется всеми экземплярами любого класса Java. Это не кажется особенно хорошей идеей. Если бы StringBuilder действительно воссоздавался каждый раз (я думаю, гораздо более вероятно, что его обработчик команд не вызывается), он должен взять текущий входной текст виджета, добавить все, что он хочет, к этому тексту, а затем установить его снова . - person Erwin Bolwidt; 31.01.2014
comment
Дело в том, что ввод текста при пересоздании виджета тоже. Весь виджет со всеми полями каждый раз воссоздается заново. Самое простое решение выше. Другое решение — сохранить текст в настройках и каждый раз перезагружать его из них. - person Autocrab; 31.01.2014