1

我正在将一个旧的 WebOS 应用程序改编为 android,并且几乎所有的应用程序都使用 phonegap(因为旧代码是 javascript,这很方便),但我希望使用本机 AutoCompleteTextView 进行输入。我收到 NullPointerException,可能是由于我的异国情调混合应用程序。但让我从头开始。我像这样附加了一个页脚(根据我在这里找到的帖子)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    super.loadUrl("file:///android_asset/www/index.html");

    /* ... boring things here ... */

    // http://stackoverflow.com/questions/7320910/android-phonegap-with-native-controls
        View footer = View.inflate(getContext(), R.layout.footer, null);
        root.addView( footer );

    // setContentView(root);
    // http://www.kwpro.net/blogs/2011/1/10/1651_Android_AutoComplete_Tutorial_Amendment.html        
}   

我在博客上发现了一些注释,建议我的问题的解决方案可能是 setContentView,但这似乎不起作用。无论如何,我使用这个(通过window.f.setAutoComplete()通过java接口)从javascript中设置了一次自动完成文本。

public void setAutoComplete(String []s) {
    Log.d(TAG, "[native]: setting autocomplete text");

    AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.inpu);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, s);
    textView.setAdapter(adapter);
}

无论如何,一切似乎都正常。也就是说,选择列表会弹出,您有时可以选择一个(有时),然后我会收到强制关闭应用程序的 NullPointerException。我觉得自己没有能力处理这个问题,所以我想我会公开问。

异常转储如下所示:

W/dalvikvm( 1832): threadid=11: thread exiting with uncaught exception (group=0x409c01f8)
E/AndroidRuntime( 1832): FATAL EXCEPTION: WebViewCoreThread
E/AndroidRuntime( 1832): java.lang.NullPointerException
E/AndroidRuntime( 1832):        at android.widget.AbsListView$RecycleBin.getScrapView(AbsListView.java:5900)
E/AndroidRuntime( 1832):        at android.widget.AbsListView.obtainView(AbsListView.java:2003)
E/AndroidRuntime( 1832):        at android.widget.ListPopupWindow$DropDownListView.obtainView(ListPopupWindow.java:1168)
E/AndroidRuntime( 1832):        at android.widget.ListView.measureHeightOfChildren(ListView.java:1244)
E/AndroidRuntime( 1832):        at android.widget.ListPopupWindow.buildDropDown(ListPopupWindow.java:1095)
E/AndroidRuntime( 1832):        at android.widget.ListPopupWindow.show(ListPopupWindow.java:524)
E/AndroidRuntime( 1832):        at android.widget.AutoCompleteTextView.showDropDown(AutoCompleteTextView.java:1062)
E/AndroidRuntime( 1832):        at android.widget.AutoCompleteTextView.updateDropDownForFilter(AutoCompleteTextView.java:939)
E/AndroidRuntime( 1832):        at android.widget.AutoCompleteTextView.onFilterComplete(AutoCompleteTextView.java:921)
E/AndroidRuntime( 1832):        at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:285)
E/AndroidRuntime( 1832):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 1832):        at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 1832):        at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:728)
E/AndroidRuntime( 1832):        at java.lang.Thread.run(Thread.java:856)

我最好的猜测是,我遇到了“只有一个线程可以做 UI 的东西”......啊......范式,但我不确定如何解决这个问题,如果是这样的话,如果那不是案例,我不知道下一步该尝试什么。

4

1 回答 1

1

Never did get a response on this, but in case anyone else runs into it... The auto complete choices are part of the ui, so you have to ask the ui to update it. Pretty simple really. I had surmised it in the question itself, but didn't reason it out all the way.

public void setAutoComplete(String []s) {
    Log.d(TAG, "[native]: setting autocomplete text");

    autoCompleteArray = s;

    handler.post(new Runnable() {
        public void run() {
            hist.clear();
            for(int i=0; i<autoCompleteArray.length; i++)
                hist.add(autoCompleteArray[i]);
            hist.notifyDataSetChanged();
        }
    });
}
于 2012-06-23T11:49:13.327 回答