设置文本大小时,按钮布局设置为Null

时间:2019-07-01 20:19:51

标签: java android nullpointerexception

我正在编写一个自定义的预想文本程序,该程序带有用于用户可以选择的不同单词选项的按钮。我遇到了一些单词占用多行的问题,因此我尝试编写一些代码,这些代码将以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。

0 个答案:

没有答案