3

Моя проблема: У меня есть AutoCompleteTextView с OnItemClickListener. Это работает отлично в течение 18 месяцев, но теперь я заметил, что он выбрасывает исключение NullPointerException, когда я выбираю элемент в ландшафтном режиме на моем HTC Desire S. (Нет ошибки в портретном режиме или на любом другом телефоне или эмуляторе. протестировали его).AutoCompleteTextView OnItemClickListener null param (ландшафтный режим на HTC Desire S)

Параметр AdapterView<?> av проходит как null. Почему это так, и как я могу обойти это?

Код:

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) 

Extra Code - мой пользовательский адаптер внутренний класс:

/** 
* 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; 
    }    
} 
+0

В манифесте для этой деятельности, вы случайно с помощью 'Android: configChanges = "ориентация"'? –

+0

Да, я: android: configChanges = "keyboardHidden | orientation" /> –

+0

Ошибка в этой строке AbstractGroupSelectionPage.java:228 что это? – Venky

ответ

0

Моя догадка заключается в том, что, поскольку вы объявляете android:configChanges="orientation" в своем манифесте, тогда при повороте старый OnItemClickListener все еще торчит, и поскольку у вас есть технически новый макет, AdapterView, который использовался до изменения ориентации, больше не существует , поэтому при нажатии на элемент значение null.

Там же 2 вещи, которые я думаю, что бы решить эту проблему, если это так:

  1. Удалите orientation опцию в манифесте. Любые события, которые вы размещаете в configChanges, сообщают Android «Я забочусь об этом изменении конфигурации, поэтому позвольте мне справиться с этим», в отличие от того, чтобы позволить Android обрабатывать его. Обычная операция для Android в случае изменения ориентации заключается в уничтожении и воссоздании вашего Activity (он позаботится о том, чтобы повторно заполнить некоторые View с данными автоматически).

  2. Если вы решили, что вам нужно обрабатывать изменения ориентации, а затем переопределить и установить OnItemClickListener на новый AdapterView объекта (ListView, GridView, в зависимости от того, который вы используете), которые должны были воссозданы в методе onCreate.

+0

Я только что попробовал вариант 1, но нулевой указатель все же произошел. Ммм, вы думаете, это означает, что ваша догадка, к сожалению, неверна? –

+0

Да, возможно так :( –