Итак, у меня есть активность, которая служит контейнером для некоторых фрагментов. В этом упражнении есть навигационный ящик, который помогает пользователю перемещаться между фрагментами.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();
}
ли вы забыли поставить перерыв по умолчанию или забыл вставить строку здесь? –