InjectView в RoboFragment

Я хочу внедрить некоторые представления из макета xml в RoboFragment, но, к сожалению, получаю исключение Nullpointer. Поскольку у RoboGuice (помимо того, что это отличная структура DI) очень мало документации, я не знаю, могу ли я использовать @ContentView(R.layout.fragmentlayout) для аннотирования своего RoboFragment. Есть ли что-то, что я должен сделать вместо этого? Что я сейчас делаю:

public class TestFragment extends RoboFragment {

    @InjectView(R.id.upBtn) private Button upBtn;   

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

        super.onCreateView(layoutInflater, container, savedInstanceState);
        View view = layoutInflater.inflate(R.layout.fragmentlayout, container, false);
        RoboGuice.getInjector(getActivity()).injectMembers(this);
        upBtn.setSelected(false);   // <------ Null pointer here
        return view;
    }
}

person Thomas Kaliakos    schedule 08.01.2013    source источник
comment
Надеюсь, вы рассмотрели эти два вопроса: stackoverflow.com/questions/9780769/ и заголовок stackoverflow.com/questions/8289660/   -  person Eugen Martynov    schedule 14.01.2013
comment
Да. Первый просто указывает, что инъекция происходит во время onViewCreated, но я не понимаю, как это сделать. Во втором я также попробовал RoboGuice.getInjector(getActivity()).injectViewMembers(this); но это не помогло.   -  person Thomas Kaliakos    schedule 14.01.2013


Ответы (2)


Если вы посмотрите на источник RoboFragment, вы увидите

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    RoboGuice.getInjector(getActivity()).injectViewMembers(this);
}

Если вы настаиваете на вводе вручную, используйте injectViewMembers(). Если вы можете отложить касание представления до onViewCreated(), оно будет настроено для вас.

person RonU    schedule 15.01.2013
comment
Хорошо, ты прав. Я не принимал ответ все это время, потому что все еще получал нулевой указатель, но по другой причине (я устанавливал прослушиватель кнопок в onCreateView). Прошу прощения за свою медлительность.. - person Thomas Kaliakos; 29.01.2013
comment
хотя @ContextView не сработал... может быть, вы знаете, возможно ли это? - person Thomas Kaliakos; 29.01.2013
comment
Я так не думаю. Глядя на источник ContentView, RoboActivity и ContentViewListener, кажется, что вы сможете использовать @ContentView только с RoboActivities. Фрагменты увеличиваются в их методе #onCreateView, как и в исходном вопросе. - person RonU; 30.01.2013

Вам нужно вернуть представление. После upBtn.setSelected(false);

public View onCreateView(LayoutInflater layoutInflater, ViewGroup container, Bundle savedInstanceState) {

    super.onCreateView(layoutInflater, container, savedInstanceState);
    View view = layoutInflater.inflate(R.layout.fragmentlayout, container, false);
    RoboGuice.getInjector(getActivity()).injectMembers(this);
    upBtn = (Button) view.findViewById(YOUR_ID); // Initialization
    upBtn.setSelected(false);   // <------ Null pointer here
 return view;
}
person Tsunaze    schedule 08.01.2013
comment
Это не решит NullPointerException. Но вы правы, ОП забыл оператор возврата в своем вопросе (не в своем реальном коде). - person jelies; 08.01.2013
comment
Нет, не работает, извините. Код фактически включал оператор return. Если бы он отсутствовал, я бы получил ошибку компиляции. - person Thomas Kaliakos; 09.01.2013
comment
Проблема связана с внедрением зависимостей (roboguice), а не с самим кодом. Он спросил, как внедрить upBtn представление во фрагмент. Недавно у меня была та же проблема, и я закончил использовать view.findById(...), но меня интересует решение, включающее @ContentView(...). - person jelies; 09.01.2013