0

Итак, у меня есть активность, которая служит контейнером для некоторых фрагментов. В этом упражнении есть навигационный ящик, который помогает пользователю перемещаться между фрагментами.Fragment's onViewCreated() вызывается при завершении родительской активности()?

Один из фрагментов (в этом случае он называется HomeFragment), при загрузке, будет извлекать некоторые данные с сервера и затем помещать их в ListView внутри HomeFragment. Этот процесс выполняется в onViewCreated().

Теперь проблема заключается в том, что, когда я завершаю операцию, объект onViewCreated HomeFragment каким-то образом вызывается. Но поскольку, когда фрагмент извлекал данные с сервера, активность уже завершена, ему не удается найти представление для ввода данных. Это приведет к сбою приложения.

Мой MainActivity.java (который содержит фрагмент):

public void setDrawerItem(MenuItem menuItem){ 
     ... 
     if (menuItem.getItemId() == R.id.logout) { 
      Intent i = new Intent(getApplicationContext(), LoginActivity.class); 
      startActivity(i); 
      finish(); 
     } 
     ... 
    } 

Таким образом, когда пользователь выйти, то MainActivity завершится, и LoginActivity начнется.

В моей HomeFragment:

public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     lv = (ListView) view.findViewById(R.id.home_listView); 

     //fill aspiration_list with aspirations from database, then populate listview 
     new AspirationGetAll().execute(); 
    } 

Класс AspirationGetAll является AsyncTask, который будет получать данные из базы данных, и заполнить ListView.

Logcat:

11-19 01:49:05.408 14290-14290/com.jefsolution.yourvote E/AndroidRuntime: FATAL EXCEPTION: main 
11-19 01:49:05.408 14290-14290/com.jefsolution.yourvote E/AndroidRuntime: Process: com.jefsolution.yourvote, PID: 14290 
11-19 01:49:05.408 14290-14290/com.jefsolution.yourvote E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.support.v4.app.FragmentActivity.getApplicationContext()' on a null object reference 
11-19 01:49:05.408 14290-14290/com.jefsolution.yourvote E/AndroidRuntime:  at com.jefsolution.yourvote.Fragment.HomeFragment$AspirationGetAll.onPostExecute(HomeFragment.java:179) 
11-19 01:49:05.408 14290-14290/com.jefsolution.yourvote E/AndroidRuntime:  at com.jefsolution.yourvote.Fragment.HomeFragment$AspirationGetAll.onPostExecute(HomeFragment.java:147) 
11-19 01:49:05.408 14290-14290/com.jefsolution.yourvote E/AndroidRuntime:  at android.os.AsyncTask.finish(AsyncTask.java:632) 
11-19 01:49:05.408 14290-14290/com.jefsolution.yourvote E/AndroidRuntime:  at android.os.AsyncTask.access$600(AsyncTask.java:177) 
11-19 01:49:05.408 14290-14290/com.jefsolution.yourvote E/AndroidRuntime:  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
11-19 01:49:05.408 14290-14290/com.jefsolution.yourvote E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:102) 
11-19 01:49:05.408 14290-14290/com.jefsolution.yourvote E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:135) 
11-19 01:49:05.408 14290-14290/com.jefsolution.yourvote E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5260) 
11-19 01:49:05.408 14290-14290/com.jefsolution.yourvote E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method) 
11-19 01:49:05.408 14290-14290/com.jefsolution.yourvote E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:372) 
11-19 01:49:05.408 14290-14290/com.jefsolution.yourvote E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
11-19 01:49:05.408 14290-14290/com.jefsolution.yourvote E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
11-19 01:49:06.778 14290-14290/com.jefsolution.yourvote I/Process: Sending signal. PID: 14290 SIG: 9 

приложение отлично работает, когда не нажав на кнопку выхода из системы в ящике. Line 179 в HomeFragment является:

AspirationAdapter adapter = new AspirationAdapter(getActivity().getApplicationContext(), aspiration_list); 

Line 147 является декларация класса AspirationGetAll.

Это метод, который обрабатывает элемент элемента навигации. Есть ли что-нибудь, что может привести к повторному жизненному циклу HomeFragment (поэтому вызов onViewCreated()) при нажатии на выход?

public void selectDrawerItem(MenuItem menuItem) { 
     // Create a new fragment and specify the planet to show based on 

     // position 

     Fragment fragment = null; 

     Class fragmentClass; 
     switch(menuItem.getItemId()) { 
      case R.id.home_fragment: 
       fragmentClass = HomeFragment.class; 
       break; 
      case R.id.trending_fragment: 
       fragmentClass = TrendingFragment.class; 
       break; 
      case R.id.my_aspiration_fragment: 
       fragmentClass = MyAspirationFragment.class; 
       break; 
      default: 
       fragmentClass = HomeFragment.class; 
     } 
     if (menuItem.getItemId() == R.id.logout) { 
      Intent i = new Intent(getApplicationContext(), LoginActivity.class); 
      startActivity(i); 
      finish(); 
     } 
     try { 
      fragment = (Fragment) fragmentClass.newInstance(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     // Insert the fragment by replacing any existing fragment 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit(); 

     // Highlight the selected item, update the title, and close the drawer 

     menuItem.setChecked(true); 
     setTitle(menuItem.getTitle()); 
     mDrawer.closeDrawers(); 
    } 
+0

ли вы забыли поставить перерыв по умолчанию или забыл вставить строку здесь? –

ответ

0

Попытка попасть в веб-службу, когда представление создается в

т.е.
onCreateView(LayoutInflater, ViewGroup, Bundle) 
{ 
    ... 
} 

onViewCreated вызывается сразу после того, как onCreateView(LayoutInflater, ViewGroup, Bundle) вернулся, но до того, как сохраненное состояние было восстановлено в вид. Это дает подклассам возможность инициализировать себя, как только они знают, что их иерархия представлений полностью создана. И основная причина исключения нулевого указателя связана с отсутствием контекста в представлении адаптера. Вы пробовали использовать getActivity() вместо getActivity().getApplicationContext()?

+0

Если я положил его в onCreateView, разве он не найдет никакого представления? Потому что макет еще не завышен. Я попытался использовать getActivity(), все еще получил ошибку. Но на этот раз он находится на pDialog.dismiss() в onPostExecute(). Тем не менее это означает, что onViewCreated() все еще вызывается, когда я пытался выйти из системы. – Jackyef

+0

У вас есть экземпляр объекта pDialog –

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