【问题标题】:Append method doesn't work in StringBuilder附加方法在 StringBuilder 中不起作用
【发布时间】:2014-01-31 12:26:26
【问题描述】:

我正在尝试创建一个小型计算器小部件,但我无法使用StringBuilder 连接输入字符串,因为每次单击按钮时小部件仅显示与单击的按钮相对应的字符串。

StringBuilder 中的 append 方法似乎不起作用。你能给我一些帮助吗?

以下是代码的相关部分:

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

谢谢

【问题讨论】:

  • 你试过调试它吗? StringBuilder.append 不工作的可能性小于它在其他地方出现问题的可能性......我怀疑你会发现一些你没有发布的代码正在清除 @ 987654325@ 在点击之间。在fnHandleCommand开始处记录(或使用调试器检查)sb 的值。
  • 你有什么问题?
  • 似乎每次点击都会初始化stringbuilder

标签: java android string android-widget stringbuilder


【解决方案1】:

私有静态 StringBuilder sb = new StringBuilder();

【讨论】:

  • 所以现在 StringBuilder 在 Java 类的所有实例之间共享。这听起来不是一个特别好的主意。如果每次都真的重新创建了 StringBuilder(我认为更有可能没有调用他的命令处理程序),他应该获取小部件的当前输入文本,将他想要的任何内容附加到该文本,然后再次设置它.
  • 问题是如果小部件也被重新创建,则输入文本。具有所有字段的整个小部件每次都会重新创建。上面是最简单的解决方案。另一种解决方案是将文本保存到首选项中,然后每次都从它们中重新加载。
猜你喜欢
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多