使用while循环的Android stackoverflow

时间:2015-07-31 10:23:06

标签: java android while-loop stack-overflow textwatcher

我使用此方法收缩TextView文字,因为它的名字暗示:

public static float shrinkTextToFit(String caller, float availableWidth, TextView textView, float startingTextSize, float minimumTextSize) {
    startingTextSize = textView.getTextSize() < startingTextSize ? textView.getTextSize() : startingTextSize;
    Log.i("123", "=========================");
    Log.i("123", caller + " called shrinkTextToFit");
    CharSequence text = textView.getText();
    float textSize = startingTextSize;
    textView.setTextSize(startingTextSize);
    while (!TextUtils.equals(text, (TextUtils.ellipsize(text, textView.getPaint(), availableWidth, TextUtils.TruncateAt.END)))) {
        textSize -= 2;
        Log.i("123", "textSize: " + textSize);
        if ((textSize <= minimumTextSize) || (textSize <= 0)) {
            break;
        } else {
            textView.setTextSize(textSize);
        }
    }
    return textSize;
}

我只能使用这些设备进行堆栈溢出(有时候它不会发生):

  • Samsung GT-I9192
  • 三星GT-I9300
  • LG-​​D290

操作系统版本:4.4.2,4.3

10  at android.widget.TextView.sendAfterTextChanged(TextView.java:8503)
11  at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:10633)
12  at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:970)
13  at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:497)
14  at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:247)
15  at android.text.TextUtils.ellipsize(TextUtils.java:1185)
16  at android.text.TextUtils.ellipsize(TextUtils.java:1079)
17  at android.text.TextUtils.ellipsize(TextUtils.java:1054)
18  at app.utils.Utils.float shrinkTextToFit(float,android.widget.TextView,float,float)

我在TextWatcher afterTextChanged()内调用此函数,是的,这可能是问题,但我们的想法是在插入文本时缩小文本大小。

@Override
public void afterTextChanged(Editable s) {
    mEditText.removeTextChangedListener(mTextWatcher);
    Utils.shrinkTextToFit("watcher", mAvailableWidth, mEditText, 50, 10);
    mEditText.addTextChangedListener(mTextWatcher);
}

示例日志:

开始输入字母(滚动以阅读所有日志):

08-01 14:48:50.284    watcher called shrinkTextToFit
08-01 14:48:50.676    =========================
08-01 14:48:50.677    watcher called shrinkTextToFit
08-01 14:48:51.749    =========================
08-01 14:48:51.749    watcher called shrinkTextToFit
08-01 14:48:51.749    textSize: 48.0
08-01 14:48:51.750    textSize: 46.0
08-01 14:48:51.751    textSize: 44.0
08-01 14:48:51.752    textSize: 42.0
08-01 14:48:52.500    =========================
08-01 14:48:52.501    watcher called shrinkTextToFit
08-01 14:48:52.501    textSize: 48.0
08-01 14:48:52.501    textSize: 46.0
08-01 14:48:52.501    textSize: 44.0
08-01 14:48:52.501    textSize: 42.0
08-01 14:48:52.501    textSize: 40.0
08-01 14:48:52.503    textSize: 38.0
08-01 14:48:52.504    textSize: 36.0
08-01 14:48:53.013    =========================
08-01 14:48:53.013    watcher called shrinkTextToFit
08-01 14:48:53.013    textSize: 48.0
08-01 14:48:53.013    textSize: 46.0
08-01 14:48:53.013    textSize: 44.0
08-01 14:48:53.014    textSize: 42.0
08-01 14:48:53.015    textSize: 40.0
08-01 14:48:53.015    textSize: 38.0
08-01 14:48:53.015    textSize: 36.0
08-01 14:48:53.016    textSize: 34.0
08-01 14:48:53.017    textSize: 32.0
08-01 14:48:53.020    textSize: 30.0
08-01 14:48:59.948    =========================
08-01 14:48:59.949    watcher called shrinkTextToFit
08-01 14:48:59.949    textSize: 48.0
08-01 14:48:59.949    textSize: 46.0
08-01 14:48:59.949    textSize: 44.0
08-01 14:48:59.949    textSize: 42.0
08-01 14:48:59.950    textSize: 40.0
08-01 14:48:59.950    textSize: 38.0
08-01 14:48:59.950    textSize: 36.0
08-01 14:48:59.950    textSize: 34.0
08-01 14:48:59.951    textSize: 32.0
08-01 14:48:59.951    textSize: 30.0
08-01 14:48:59.951    textSize: 28.0

开始删除字母:

08-01 14:48:59.953    =========================
08-01 14:48:59.953    watcher called shrinkTextToFit
08-01 14:48:59.954    textSize: 48.0
08-01 14:48:59.954    textSize: 46.0
08-01 14:48:59.954    textSize: 44.0
08-01 14:48:59.954    textSize: 42.0
08-01 14:48:59.954    textSize: 40.0
08-01 14:48:59.954    textSize: 38.0
08-01 14:48:59.954    textSize: 36.0
08-01 14:48:59.954    textSize: 34.0
08-01 14:48:59.954    textSize: 32.0
08-01 14:48:59.954    textSize: 30.0
08-01 14:49:00.116    =========================
08-01 14:49:00.116    watcher called shrinkTextToFit
08-01 14:49:00.116    textSize: 48.0
08-01 14:49:00.117    textSize: 46.0
08-01 14:49:00.117    textSize: 44.0
08-01 14:49:00.117    textSize: 42.0
08-01 14:49:00.117    textSize: 40.0
08-01 14:49:00.117    textSize: 38.0
08-01 14:49:00.117    textSize: 36.0
08-01 14:49:00.121    =========================
08-01 14:49:00.121    watcher called shrinkTextToFit
08-01 14:49:00.121    textSize: 48.0
08-01 14:49:00.121    textSize: 46.0
08-01 14:49:00.121    textSize: 44.0
08-01 14:49:00.121    textSize: 42.0
08-01 14:49:00.284    =========================
08-01 14:49:00.284    watcher called shrinkTextToFit
08-01 14:49:00.288    =========================
08-01 14:49:00.288    watcher called shrinkTextToFit
08-01 14:49:00.444    =========================

我做错了什么?如何改进此解决方案以防止出现此异常?

2 个答案:

答案 0 :(得分:1)

我认为你应该对文本化进行数学运算,并运行你的setTextSize 一次

即使您使用某种临时视图来进行工作,也要从中获取大小。而不是使用eventlistener调用视图。

答案 1 :(得分:1)

我找到了解决方案,或者说接缝,这很奇怪也很奇怪。所以我注意到我正在调试一些奇怪的事情(因为我第一次可以重现这个错误):

我注意到文本“绿色”时文本被“解析得好”:

enter image description here enter image description here

但有时候文字不是“绿色”,特别是如果文字像“...... / ......”那样......:

enter image description here enter image description here


这导致StackOverflow,因为TextUtils.ellipsize没有返回,调试器也有点奇怪。

更改此内容:

CharSequence text = textView.getText();

对此:

CharSequence text = textView.getText().toString();

解决方案。
现在它正在发挥作用。感谢IntelliJ成为有史以来最好的IDE:)