java.lang.NullPointerException в onResume(). Есть идеи?

Я работаю с вкладками и фрагментами внутри них. Получил эту странную ошибку времени выполнения в одном из фрагментов:

Логкат:

05-13 09:52:46.052    1276-1276/com.myapp.gridview E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.myapp.gridview, PID: 1276
java.lang.NullPointerException
        at com.myapp.gridview.BoardsFragment.onResume(BoardsFragment.java:34)
        at android.support.v4.app.Fragment.performResume(Fragment.java:1543)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:974)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
        at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:478)
        at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
        at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
        at android.view.View.measure(View.java:16497)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
        at android.view.View.measure(View.java:16497)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
        at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327)
        at android.view.View.measure(View.java:16497)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291)
        at android.view.View.measure(View.java:16497)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1916)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1113)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1295)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
        at android.view.Choreographer.doCallbacks(Choreographer.java:574)
        at android.view.Choreographer.doFrame(Choreographer.java:544)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)

и сам фрагмент:

import android.content.Context;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class BoardsFragment extends Fragment{
    private GridView gridView;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle    savedInstanceState) {
        View v = inflater.inflate(R.layout.activity_main, container, false);
        gridView = (GridView) v.findViewById(R.id.gridview);
        return v;
    }
    @Override
    public void onResume(){
        super.onResume();
        gridView.setAdapter(new MyAdapter(getActivity()));

    }

    private class MyAdapter extends BaseAdapter
    {
        private List<Item> items = new ArrayList<Item>();
        private LayoutInflater inflater;

        public MyAdapter(Context context)
        {
            inflater = LayoutInflater.from(context);

            items.add(new Item("APO Supreme", R.drawable.snb_apo_supreme));
            items.add(new Item("Arbor Blacklist", R.drawable.snb_arbor_blacklist));
            items.add(new Item("Arbor Draft", R.drawable.snb_arbor_draft));
            items.add(new Item("Arbor Relapse", R.drawable.snb_arbor_relapse));
            items.add(new Item("Capita Defenders of Awesome", R.drawable.snb_capita_defenders_of_awesome));
            items.add(new Item("Capita Outsiders", R.drawable.snb_capita_outsiders));
            items.add(new Item("Capita Ultrafear", R.drawable.snb_capita_ultrafear));
            items.add(new Item("DC Focus", R.drawable.snb_dc_focus));
            items.add(new Item("DC Mega", R.drawable.snb_dc_mega));
            items.add(new Item("DC Tone", R.drawable.snb_dc_tone));
            items.add(new Item("ROME Agent", R.drawable.snb_rome_agent));
            items.add(new Item("ROME Agent Rocker", R.drawable.snb_rome_agent_rocker));
            items.add(new Item("ROME Hammerhead", R.drawable.snb_rome_hammerhead));

    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public Object getItem(int i)
    {
        return items.get(i);
    }

    @Override
    public long getItemId(int i)
    {
        return items.get(i).picId;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup)
    {
        View v = view;
        ImageView picture;
        TextView name;

        if(v == null)
        {
            v = inflater.inflate(R.layout.gridview_item, viewGroup, false);
            v.setTag(R.id.picture, v.findViewById(R.id.picture));
            v.setTag(R.id.text, v.findViewById(R.id.text));
        }

        picture = (ImageView)v.getTag(R.id.picture);
        name = (TextView)v.getTag(R.id.text);

        Item item = (Item)getItem(i);

        picture.setImageResource(item.picId);
        name.setText(item.name);

        return v;
    }

    private class Item
    {
        final String name;
        final int picId;

        Item(String name, int drawableId)
        {
            this.name = name;
            this.picId = drawableId;
        }
    }
}

}

Есть идеи, что здесь не так с onResume()? Возможно это связано с support.v4 библиотекой. Возможно, этим библиотекам нужно какое-то «специальное» переопределение onResume и т. Д.?

Спасибо за ответы

ИЗМЕНИТЬ:

Activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.myapp.gridview.MainActivity" />

фрагмент_main.xml с GridView:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<GridView
    android:id="@+id/gridview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:verticalSpacing="0dp"
    android:horizontalSpacing="0dp"
    android:stretchMode="columnWidth"
    android:numColumns="2"
/>
</FrameLayout>

person AnZyuZya    schedule 13.05.2014    source источник
comment
сообщение activity_main.xml   -  person Raghunandan    schedule 13.05.2014
comment
в каком макете у вас есть GridView?   -  person Raghunandan    schedule 13.05.2014
comment
В моем ответе хорошо видно, что gridview не находится в activity_main.xml. Измените макет, который вы надуваете, на framgent_main.xml   -  person Raghunandan    schedule 13.05.2014


Ответы (2)


Есть идеи, что здесь не так с onResume()?

Ничего плохого.

Возможно это связано с библиотекой support.v4.

NUllPointerException не относится к библиотеке поддержки

Возможно, этим библиотекам нужно какое-то «специальное» переопределение onResume и т. Д.?

Специального onResume для библиотек нет

У тебя есть

View v = inflater.inflate(R.layout.activity_main, container, false);

Я предполагаю, что вы раздуваете макет Activity в Fragment. gridView равно нулю.

Вероятно, это должно быть

View v = inflater.inflate(R.layout.fragment_main, container, false);

Вероятно, у вас GridView в fragment_main.xml

person Raghunandan    schedule 13.05.2014
comment
gridView имеет значение null, потому что это нормальное поведение при переключении между фрагментами, чтобы пропустить onCreate() и возобновить с onResume(). Это означает, что после переключения gridView не был инициализирован и равен нулю. - person ThaMe90; 13.05.2014
comment
Это то же самое, что и при переключении между действиями. - person ThaMe90; 13.05.2014
comment
@ ThaMe90 откуда взялся onCreate. Это onCreateView из Fragment - person Raghunandan; 13.05.2014
comment
Он вызывается при создании фрагмента, а не при переключении между существующими фрагментами. - person ThaMe90; 13.05.2014
comment
@ ThaMe90 Посмотрите на жизненный цикл фрагмента и его метод, я думаю, вы неправильно поняли - person Raghunandan; 13.05.2014
comment
@ ThaMe90 то, что вы говорите, не имеет ничего общего с аварией. gridview имеет значение null, потому что оператор раздувает неправильный макет - person Raghunandan; 13.05.2014

Есть только две возможности. gridView или getActivity() имеют значение null. Вы можете легко обнаружить это. Поставьте точку останова на этой строке. Отладьте свое приложение. Затем выберите gridView и нажмите комбинацию cmd+shift+I, чтобы увидеть значение gridView (повторите эти шаги для getActivity()).

Если gridView имеет значение null, вы можете инициализировать его в onResume().

Если getActivity() имеет значение null, вы должны переопределить onActivityCreated() и установить там адаптер gridView.

person Onuray Sahin    schedule 13.05.2014