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