Fotonick
@Fotonick
android-er (Навальный отменит налоги фрилансерам)

Почему приложение крашится, когда в Tabbed Activity возвращаюсь на первые две вкладки?

Я создал активити с вкладками стандартным способом встроенным в андроид студию. Каждая вкладка содержит 2 вложенных фрагмента - в первом фрагменте фильтры, в зависимости от выбора которых вкладывается нужный второй фрагмент. Вкладки нормально проходят по порядку от первой до последней (4 штуки). Между первыми двумя вкладками слайдится отлично, и между 3 и 4 тоже нормально переключается. Но если с 3й или 4й вернуться на 1ю или 2ю вкладку, то приложение крашится, причем всегда ругается на фрагмент принадлежащий первой вкладке, даже если слайдишь с 3-й на 2ю вкладку. Что не так?

Переключение между вкладками в активити
switch(position){
                case 0:
                    Fragment addNewFragment = new AddNew_fragment();
                    Bundle args = new Bundle();
                    args.putString("connectURL", connectURL);
                    args.putString("access_token", access_token);
                    addNewFragment.setArguments(args);
                    return addNewFragment;
                case 1:
                    Fragment toDoListFragment = new ToDoListFragment();
                    Bundle args1 = new Bundle();
                    args1.putString("connectURL", connectURL);
                    args1.putString("access_token", access_token);
                    toDoListFragment.setArguments(args1);
                    return toDoListFragment;
                case 2:
                    Fragment allNewsFragment = new AllNewsFragment();
                    Bundle args2 = new Bundle();
                    args2.putString("connectURL", connectURL);
                    args2.putString("access_token", access_token);
                    allNewsFragment.setArguments(args2);
                    return allNewsFragment;
                case 3:
                    Fragment myPageFragment = new MyPageFragment();
                    Bundle args3 = new Bundle();
                    args3.putString("connectURL", connectURL);
                    args3.putString("access_token", access_token);
                    myPageFragment.setArguments(args3);
                    return myPageFragment;
                default:
                    return null;
            }


Вложенный фрагмент 2го уровня на первой вкладке, на который студия всегда и ругается.
public class GoalsListFragment extends ListFragment {

    int goalID;
    int goalExist;

    JSONObject jsonResponseReports = null;
    JSONObject jsonResponse;
    JSONArray items;

    String goalDescriptionText;


    StringBuilder feedInput;

    String connectURL;

    ArrayList<String> allGoalsList;
    ArrayAdapter adapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        connectURL = getArguments().getString("connectURL");
        View goalFragment = inflater.inflate(R.layout.fragment_goals_list, null);

        allGoalsList = new ArrayList<String>();

        new GetAllGoals().execute();

        return goalFragment;
    }



    private class GetAllGoals extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            try {

                URL url = new URL(connectURL);

                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("POST");
                connection.setDoOutput(true); // Triggers POST.
                connection.setDoInput(true);


                BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));

                feedInput = new StringBuilder();

                String inputBufferSymbol = "";

                while ((inputBufferSymbol = br.readLine()) != null) {
                    feedInput.append(inputBufferSymbol);
                }
                br.close();


                jsonResponseReports = new JSONObject(feedInput.toString());
                jsonResponse = jsonResponseReports.getJSONObject("response");
                if (jsonResponse.getString("count").equals("0")) {
                    goalDescriptionText = "В этой сфере жизни вы не поставили ни одной цели";
                    goalExist = 0;
                } else {
                    goalExist = 1;

                    items = jsonResponse.getJSONArray("items");

                    int count=0;

                    while (count<Integer.parseInt(jsonResponse.getString("count")))
                    {
                        allGoalsList.add(items.getJSONObject(count).getString("title"));
                        count++;
                    }
                }

            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_activated_1, allGoalsList);
            setListAdapter(adapter);
        }
    }
}


ругается всегда на адаптер в onPostExecute
adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_activated_1, allGoalsList);


09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim D/AndroidRuntime: Shutting down VM
09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xb2cd8908)
09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim E/AndroidRuntime: FATAL EXCEPTION: main
09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim E/AndroidRuntime: java.lang.NullPointerException
09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim E/AndroidRuntime: at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim E/AndroidRuntime: at android.widget.ArrayAdapter.(ArrayAdapter.java:153)
09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim E/AndroidRuntime: at fragments.GoalsListFragment$GetAllGoals.onPostExecute(GoalsListFragment.java:122)
09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim E/AndroidRuntime: at fragments.GoalsListFragment$GetAllGoals.onPostExecute(GoalsListFragment.java:63)

09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim E/AndroidRuntime: at android.os.AsyncTask.finish(AsyncTask.java:631)
09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim E/AndroidRuntime: at android.os.AsyncTask.access$600(AsyncTask.java:177)
09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim E/AndroidRuntime: at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim E/AndroidRuntime: at android.os.Looper.loop(Looper.java:137)
09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5041)
09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
09-21 18:07:56.920 1729-1729/im.upgrade.upgradeim E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
  • Вопрос задан
  • 605 просмотров
Решения вопроса 1
@Tiberal
На момент завершения работы потока, фрагмент может быть не прикреплен к активити и тогда getActivity() вернет null и все упадет. Оберните код следующим образом

if(isAdded()){
                ArrayAdapter adapter;
                adapter = new ArrayAdapter(getActivity(),android.R.layout.simple_list_item_activated_1, allGoalsList);

}

еще проверьте нормально ли allGoalsList формируется
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Firsto
@Firsto
Демагог и маргинал.
Брейкпоинт поставь там и в режиме отладки смотри, где у тебя там null.
Я подозреваю, что getActivity() возвращает null. Если так, то сохраняй контекст во фрагменте.
Ответ написан
Комментировать
pumba30
@pumba30
Как один из вариантов в конструктор адаптера добавь R.id айтема листа.
Например, у меня крашилось при

adapter = new ArrayAdapter<>(MainActivity.this, R.layout.list_item,  tags);

но выяснилось, что адаптеру еще нужен айтем листа, который нужно определить
adapter = new ArrayAdapter<>(MainActivity.this, R.layout.list_item,
               R.id.textView,  tags);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы