我正在编写一个自定义的预想文本程序,该程序带有用于用户可以选择的不同单词选项的按钮。我遇到了一些单词占用多行的问题,因此我尝试编写一些代码,这些代码将以5的增量减小大小,直到适合一行。
要确定文本是否多行,我使用button.getLayout().getLineEnd()
并将其与按钮中单词的大小进行比较。效果很好,但是当我将大小减5后尝试检查单词是否仍在多行上时,布局为空引用。
这是我正在使用的代码:
private Button updatePredictiveTextFontSize(Button button){
try {
Layout layout = button.getLayout();
int lineEnd = layout.getLineEnd(0),
textLength = button.getText().length();
while (lineEnd != textLength){
if (lineEnd < textLength) {
button.setTextSize(button.getTextSize() - 5);
layout = button.getLayout();
lineEnd = layout.getLineEnd(0);
}
}
}catch(NullPointerException npe){
npe.printStackTrace();
Log.e("Button: ", npe.getMessage());
}
return button;
}
我发现在执行button.setTextSize(button.getTextSize() - 5)
之后,布局立即设置为null。我尝试将布局作为自己的东西进行拆分,然后手动设置按钮的布局,但是如果设置为null的布局发生在设置大小之后,则没有任何意义。为了增加我的约束,将要在API 25上使用我们的应用程序的设备已用尽,因此我无法在API 26中使用自动文本大小。
这是堆栈跟踪和消息:
W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.text.Layout.getLineEnd(int)' on a null object reference
W/System.err: at com.oc.horizons.horizons.Common.Keyboards.QwertyKeyboard.updatePredictiveTextFontSize(QwertyKeyboard.java:384)
W/System.err: at com.oc.horizons.horizons.Common.Keyboards.QwertyKeyboard.checkTyping(QwertyKeyboard.java:354)
W/System.err: at com.oc.horizons.horizons.Common.Keyboards.QwertyKeyboard.onClick(QwertyKeyboard.java:279)
W/System.err: at android.view.View.performClick(View.java:5637)
W/System.err: at android.view.View$PerformClick.run(View.java:22429)
W/System.err: at android.os.Handler.handleCallback(Handler.java:751)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err: at android.os.Looper.loop(Looper.java:154)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6119)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
E/Button:: Attempt to invoke virtual method 'int android.text.Layout.getLineEnd(int)' on a null object reference
这不仅是一个简单的NullPointerException
问题,因为Button在代码中的初始化要早得多。这里的问题是,在我调用button.setTextSize(button.getTextSize() - 5)
之前,Button的Layout不为null,但是在那一行之后,它已变为null,之后我也不明白为什么它为null。