Java 使用while循环的Android堆栈溢出

Java 使用while循环的Android堆栈溢出,java,android,while-loop,stack-overflow,textwatcher,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.get

我正在使用此方法收缩
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;
}
我在
TextWatcher
postertextchanged()
中调用此函数,是的,这可能是问题所在,但想法是在插入文本时缩小文本大小

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

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

开始擦除字母:

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    =========================

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

我认为您应该计算一下textsize,然后运行一次setTextSize


即使您使用某种临时视图来进行工作,也要从中获取大小。我没有用eventlistener来反对视图。

我找到了解决方案,或者说它是无缝的,这很奇怪。因此,我注意到我调试时出现了一些奇怪的问题(因为这是我第一次重现这个错误):

我注意到当文本为“绿色”时,文本被“解析良好”:

但有时文本不是“绿色”,特别是如果文本是“....”:


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

更改此选项:

CharSequence text = textView.getText();
为此:

CharSequence text = textView.getText().toString();
这就是解决方案。

现在它开始工作了。感谢IntelliJ成为有史以来最好的IDE:)

只是一个猜测,但是当您修改方法中的文本时,这可能会再次导致调用您的方法,然后修改文本,这再次…@FlorianSchaetz inside
postertextchanged()
我正在做:
removeTextChangedListener(mTextWatcher)
,调用我的函数,然后
addTextChangedListener(mTextWatcher)
。我认为这可以防止出现这种情况,但我可能错了。添加添加TextChangedListener时的代码调试应用程序或添加日志语句可能会向您显示发生了什么?我不认为删除textchangelistener并重新添加它不能解决该问题。下一关你会再次接到电话。我的猜测是,你在没有出口的情况下不断地调用这个文本更改循环。虽然我不知道所提供的代码中有什么会导致这种情况(除非
setTextSize()
将其抛出到这个循环中),但我将尝试这种方法并用结果更新帖子。谢谢;)
CharSequence text = textView.getText();
CharSequence text = textView.getText().toString();