3

私の問題: OnItemClickListener を持つ AutoCompleteTextView があります。これは 18 か月間正常に動作していましたが、HTC Desire S で横表示モードで項目を選択すると NullPointerException がスローされることに気付きました (縦表示モードでも、私が使用した他の電話またはエミュレーターでもエラーは発生しません)。でテストしました)。

パラメータはAdapterView<?> avヌルとして通過しています。これはなぜですか?どうすれば回避できますか?

コード :

myAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.myAutoCompleteTextView);
myAutoCompleteTextView.setSingleLine();

myAutoCompleteTextView.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> av, View v, int index, long arg) {
        String selectedItem = (String)av.getItemAtPosition(index);  
        //Do stuff with selected item ...
    }
}

エラー :

 java.lang.NullPointerException
    at uk.co.myCompany.mobile.android.myCompanymobile.pages.groups.AbstractGroupSelectionPage$3.onItemClick(AbstractGroupSelectionPage.java:228)
    at android.widget.AutoCompleteTextView.onCommitCompletion(AutoCompleteTextView.java:993)
    at com.android.internal.widget.EditableInputConnection.commitCompletion(EditableInputConnection.java:76)
    at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:368)
    at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:86)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:150)
    at android.app.ActivityThread.main(ActivityThread.java:4385)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
    at dalvik.system.NativeStart.main(Native Method)

追加コード - 私のカスタムアダプター内部クラス:

/**
 * An inner class to simply make a custom adapter in which we can alter the on-screen look of selected groups.
 */
private class SelectedGroupAdapter extends ArrayAdapter<Group> {
    private ArrayList<Group> items;
    private int layout;

    public SelectedGroupAdapter(Context context, int layout, ArrayList<Group> items) {
        super(context, layout, items);
        this.items = items;
        this.layout = layout;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(layout, null);
        }                           
        Group o = items.get(position);

        //Display the group name and number of contacts
        if (o != null) {
            TextView groupName = (TextView) v.findViewById(R.id.groupName);
            TextView noOfContacts = (TextView) v.findViewById(R.id.noOfContacts);
            if (groupName != null) {
                groupName.setText(o.getGroupName());
            }
            if(noOfContacts != null) {
                if (o.isDynamic())
                    noOfContacts.setText(getString(R.string.dynamic));
                else {
                    int contactsCount = o.getGroupSize();
                    if(contactsCount == 1) noOfContacts.setText(contactsCount + " " + getString(R.string.contact));
                    else noOfContacts.setText(contactsCount + " " + getString(R.string.contacts));
                }
            }
        }
        return v;
    }              
}  
4

1 に答える 1

0

私の勘ではandroid:configChanges="orientation"、マニフェストで宣言しているので、回転しても古いOnItemClickListenerものはまだ残っています。技術的には新しいレイアウトがあるためAdapterView、向きを変更する前に使用されていたものはもう存在しないため、nullになります。アイテムをクリックしたとき。

これが事実である場合、これを解決すると私が思う2つのことがあります:

  1. orientationマニフェストのオプションを削除します。あなたが配置するイベントはすべてconfigChanges、Androidに処理させるのではなく、Androidに「この構成変更を処理しているので処理させてください」と伝えます。向きが変更された場合のAndroidの通常の操作は、を破棄して再作成するActivityことです(一部Viewのデータを自動的に再入力します)。

  2. 向きの変更を処理する必要があると判断した場合は、メソッドで再作成されているはずの新しいオブジェクト(、、、使用している方)をオーバーライドonConfigurationChanged()して設定します。OnItemClickListenerAdapterViewListViewGridViewonCreate

于 2012-06-20T14:26:11.897 に答える