AutoCompleteTextView showDropDown中的IllegalArgumentException

use*_*856 8 android

我在Google Play控制台收到了此崩溃报告,这是我自己从未体验过的.

java.lang.IllegalArgumentException: 
  at android.widget.ListPopupWindow.setHeight (ListPopupWindow.java:541)
  at android.widget.AutoCompleteTextView.setDropDownHeight (AutoCompleteTextView.java:414)
  at .MyEditText.showDropDown (MyEditText.java:44)
  at android.widget.AutoCompleteTextView.updateDropDownForFilter (AutoCompleteTextView.java:1086)
  at android.widget.AutoCompleteTextView.onFilterComplete (AutoCompleteTextView.java:1068)
  at android.widget.Filter$ResultsHandler.handleMessage (Filter.java:285)
  at android.os.Handler.dispatchMessage (Handler.java:105)
  at android.os.Looper.loop (Looper.java:172)
  at android.app.ActivityThread.main (ActivityThread.java:6637)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:240)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:767)
Run Code Online (Sandbox Code Playgroud)

我使用这种showDropDown方法从屏幕底部留下50 dp的空间,这样下拉菜单就不会覆盖我底部的Admob广告.

public void showDropDown() {
    Rect displayFrame = new Rect();
    getWindowVisibleDisplayFrame(displayFrame);

    int[] locationOnScreen = new int[2];
    getLocationOnScreen(locationOnScreen);

    int bottom = locationOnScreen[1] + getHeight();
    int availableHeightBelow = displayFrame.bottom - bottom;
    Resources r = getResources();
    int bannerHeight = Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, r.getDisplayMetrics()));
    int downHeight = availableHeightBelow - bannerHeight;
    setDropDownHeight(downHeight);

    super.showDropDown();
}
Run Code Online (Sandbox Code Playgroud)

从Google Play控制台,此次崩溃只影响运行Android 8.0的Mi A1和Mate 10 Pro.我没有在运行Android 8.0的模拟器上遇到此崩溃.

这是期望的效果:

在此输入图像描述

Non*_*nos 7

它看起来像则抛出这里.如果您跟踪早期版本的Android(N及更早版本),则防御代码不存在.根据您的计算,高度可能是负数.我认为你需要一种不同的方式来达到预期的效果.你的布局怎么样?


use*_*856 4

我暂时添加了代码来检查是否downHeight > 0可以防止此崩溃。

public void showDropDown() {
        Rect displayFrame = new Rect();
        getWindowVisibleDisplayFrame(displayFrame);

        int[] locationOnScreen = new int[2];
        getLocationOnScreen(locationOnScreen);

        int bottom = locationOnScreen[1] + getHeight();
        int availableHeightBelow = displayFrame.bottom - bottom;
        Resources r = getResources();
        int bannerHeight = Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, r.getDisplayMetrics()));
        int downHeight = availableHeightBelow - bannerHeight;
        if (downHeight > 0) {
            setDropDownHeight(downHeight);
        } else {
            setDropDownHeight(300);
        }

        super.showDropDown();
    }
Run Code Online (Sandbox Code Playgroud)