2015-04-27 4 views
0

Я устанавливаю базовый ArrayAdapter. Когда я несколько раз поворачиваю экран, я получаю исключение nullpointer.android - init arrayadapter, получение исключения nullpointer

public void testListView(){   
    my_array_list.add("hello world 1"); 
    my_array_list.add("hello world 2"); 
    my_array_list.add("hello world 3"); 
//next line does the problem 
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, my_array_list); 
    mListView.setAdapter(arrayAdapter); 
} 

это мой onCreateView()

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.developer_test_side, container, false); 
    ... 
    my_array_list = new ArrayList<>(); 
    mListView = (ListView) v.findViewById(R.id.my_listview); 
    testListView(); 
} 

здесь выход LogCat:

04-27 20:10:45.985 11813-11813/com.rivler.example E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.rivler.example, PID: 11813 
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference 
     at android.widget.ArrayAdapter.init(ArrayAdapter.java:310) 
     at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:153) 
     at com.example.rivler.DeveloperTestSide.testListView(DeveloperTestSide.java:116) 
     at com.example.rivler.DeveloperTestSide$6.run(DeveloperTestSide.java:149) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5312) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 

что может быть проблема?

+0

getActivity возвращает null, потому что ваш метод вызывается в потоке без учета присоединенного фрагмента или нет. – njzk2

+2

Возможный дубликат [Что такое исключение NullPointerException и как его исправить?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) –

ответ

0

Деятельность, выполняющая ваш фрагмент, воссоздается каждый раз, когда экран вращается. Сам Fragment сам воссоздается и снова присоединяется к Activity.

Вызов getActivity() возвращает NULL, если Fragment еще не подключен или сам Activity не воссозданы (a.k.a мы еще не достигли метода onActivityCreated() жизненного цикла). Это приводит к возникновению NullPointerException в ArrayAdapter.

Чтобы решить вашу проблему - просто сохраните свой контекст в onAttach() и используйте его. Другой вариант, чтобы всегда обернуть вызовы getActivity() с isAdded(), как это:

if (isAdded()) { 
    // code that needs getActivity() 
} 
+0

К сожалению, это все равно со мной, даже если я проверю, добавлен ли фрагмент. – gphilip

0

Звучит так, будто вид разрушается, и код по-прежнему пытается получить доступ к несуществующему компоненту (моя догадка заключается в том, что getActivity() возвращает null). Изменение ориентации экрана приведет к тому, что ваше изображение будет уничтожено.

Попробуйте переместить логику в onResume.

0

Если вам не нужны или хотите вращение экрана на этой деятельности, то вы можете добавить следующие строки в манифесте.

<activity 
     android:name=".MainActivity" 
     android:screenOrientation="portrait"> 
</activity> 

Это не позволит вращению в первую очередь, поэтому ваш фрагмент никогда не будет уничтожен. Вы можете, конечно, сказать, что это пейзаж, если хотите.

Смежные вопросы