2013-04-17 2 views
1

У меня есть хост-активность и фрагмент. В этом фрагменте у меня есть метод обновления, который загружает некоторые данные в AsyncTask из БД и обновляет GridView.Вызов метода Фрагмента из области Упражнение

Когда я называю этот метод от хозяина деятельности иногда я получаю NullPointerExeption, и я не знаю, почему ...

Вот метод своей деятельности, которая представляет собой интерфейс:

@Override 
public void onDataSetChange() { 

    ((CalendarFragment) getSupportFragmentManager().findFragmentByTag(Constants.FRAGMENT_CALENDAR_TAG)).updateGridView(); 
} 

И метод обновления фрагмента:

public void updateGridView() { 

    // Loading the new updated data 
    mLoadingTask = new LoadingDataTask(); 
    mLoadingTask.execute((Void) null); 
} 

Вот исключение в LogCat:

04-17 12: 05: 28,366: Е/AndroidRuntime (17789): неустранимые: Основной 04-17 12: 05: 28,366: Е/AndroidRuntime (17789): java.lang.NullPointerException 04-17 12: 05: 28.366: E/AndroidRuntime (17789): at com.sk.neverforget.MainActivity.onDataSetChange (MainActivity.java:397) 04-17 12: 05: 28.366: E/AndroidRuntime (17789): at com. sk.neverforget.fragments.DiaryFragment $ StoringDataTask.onPostExecute (DiaryFragment.java:543) 04-17 12: 05: 28.366: E/AndroidRuntime (17789): at com.sk.neverforget.fragments.DiaryFragment $ StoringDataTask.onPostExecute (DiaryFragment.java:1) 04-17 12: 05: 28.366: E/AndroidRuntime (17789): at android.os.AsyncTask.finish (AsyncTask.java:631) 04-17 12: 05: 28.366: E/AndroidRuntime (17789): at android.os.AsyncTask.access $ 6 00 (AsyncTask.java:177) 04-17 12: 05: 28.366: E/AndroidRuntime (17789): at android.os.AsyncTask $ InternalHandler.handleMessage (AsyncTask.java:644) 04-17 12:05: 28.366: E/AndroidRuntime (17789): at android.os.Handler.dispatchMessage (Handler.java:99) 04-17 12: 05: 28.366: E/AndroidRuntime (17789): at android.os.Looper.loop (Looper.java:137) 04-17 12: 05: 28.366: E/AndroidRuntime (17789): at android.app.ActivityThread.main (ActivityThread.java:5039) 04-17 12: 05: 28.366: E/AndroidRuntime (17789): at java.lang.reflect.Method.invokeNative (собственный метод) 04-17 12: 05: 28.366: E/AndroidRuntime (17789): at java.lang.reflect.Method.invoke (Method.java : 511) 04-17 12: 05: 28.366: E/AndroidRuntime (17789): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:793) 04-17 12: 05: 28.366: E/AndroidRuntime (17789): at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:560) 04-17 12: 05: 28.366: E/AndroidRuntime (17789): at dalvik.system.NativeStart.main (родной метод)

+0

Я предполагаю, что findfragmentbytag возвращает значение null, попробуйте присвоить свой фрагмент переменной перед запуском метода и отладки, чтобы узнать, является ли ваш фрагмент нулевым или нет, если так выяснить, почему он равен нулю. – ePeace

+0

Странно. Эти теги расположены и задаются в отдельном статическом классе Constants. Но я попробую ваше предложение. – Seishin

+0

Отправьте логарифм исключения, пожалуйста. – Egor

ответ

0

Прежде чем вызывать updateGridView, рекомендуется проверить ваш CalendarFragment для null. Когда вы добавляете этот фрагмент, неясно. Возможно, он еще не добавлен или уже удален.

@Override 
public void onDataSetChange() { 

CalendarFragment fragment = ((CalendarFragment)getSupportFragmentManager().findFragmentByTag(Constants.FRAGMENT_CALENDAR_TAG)); 
if(fragment != null) fragment.updateGridView(); 
} 
+0

Это хороший момент, но я не думаю, что это так. Просто потому, что у меня есть хост активности, который запускает фрагмент. Из этого фрагмента я запускаю еще один, в котором я делаю некоторую работу и сохраняю ее в локальной базе данных. На обратном пути, например, выталкивая последний фрагмент, я возвращаюсь к предыдущему в стеке, например. первый фрагмент, который я начинаю с хоста активности. :) – Seishin

+0

Будет интересно, если вы добавите «FragmentManager.enableDebugLogging (enabled)» в свой код и публичные журналы. – akelix

+0

Просто включил его (не знал, что такое «вещь» существует! :)), и все в порядке от того, что я вижу из журналов. :) – Seishin

0

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

+0

Я думаю, что у меня такая же проблема, как и вы. Когда вы говорите, что вы получили свой код для работы, обратившись к фрагменту из «локальной переменной», что вы имеете в виду? Можете ли вы опубликовать свой код для доступа к фрагменту и его методу из локальной переменной фрагмента? Благодаря! – Natalie

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