2013-05-29 2 views
0

Я использую фрагменты. Мне нужен класс, расширяющий FragmentActivity для реализации интерфейса, который служит слушателем из моих фрагментов. Когда я нажимаю элемент из gridview, он запускает метод onItemClick, но переменная слушателя равна null, даже если я установил ее в GamePlayActivity.Интерфейс nullpointerexception в фрагменте onItemClickListener из gridview

Мое понимание заключается в том, что я работаю над двумя разными способами, когда я создаю экземпляр своего фрагмента для установки слушателя и когда onCreateView() вызывается в моем классе фрагментов.

Образец от Google выполняет ту же реализацию с onClick, и он работает. Не на моем.

MainActivity extending FragmentActivity и Fragment class например.

Фрагмент 1

public class FragmentOne extends Fragment implements OnItemClickListener { 

    Listener listener = null; 

    interface Listener { 
     public void applyGameLogic(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     View layout = inflater.inflate(R.layout.fragment_fragpane, container, false); 
     GridView gridView = (GridView) layout.findViewById(R.id.grid); 
     gridView.setAdapter(new ImageAdapter(layout.getContext())); 

     gridView.setOnItemClickListener(this); 

     return layout; 
    } 

    public void setListener(Listener listener) { 
     this.listener = listener; 
    } 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     //listener.applyGameLogic(); this listener is null 
    } 
} 

GamePlayActivity

public class GamePlayActivity extends FragmentActivity implements WordPane.Listener, ChainPane.Listener { 

    private FragmentOne fragment1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
      setContentView(R.layout.game_container); 

     fragment1 = new FragmentOne(); 

     fragment1.setListener(this); 
    } 

    ... applyGameLogic method follows but its empty for now 
} 

ответ

1
fragment1 = new FragmentOne(); 
fragment1.setListener(this); 

Вы создаете новый экземпляр FragmentOne, а затем назначая щелчок слушателя к этому новому экземпляру. Вместо этого вы должны найти существующий фрагмент в макете

FragmentManager fm = getSupportFragmentManager(); // or getFragmentManager() if you aren't using the support library 
fragment1 = (FragmentOne)fm.findFragmentById(R.id.fragment_one); 

, а затем установить слушатель

fragment1.setListener(this); 
+0

Красивая! Спасибо! Я использовал getSupportFragmentManager() в библиотеке поддержки. Это дало мне ошибки с getFragmentManager(). – awonderer

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