2013-01-08 1 views
6

Я хочу добавить некоторые виды из макета xml в RoboFragment, но, к сожалению, я получаю Nullpointer Exception. Поскольку RoboGuice (помимо того, что он является отличной базой DI), имеет очень мало документации, я не знаю, могу ли я использовать @ContentView(R.layout.fragmentlayout) для аннотации моего RoboFragment. Я должен что-то сделать вместо этого? То, что я в настоящее время сделать это:
InjectView in 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; 
    } 
} 
+0

Надеюсь, вы взглянули на эти два вопроса: http://stackoverflow.com/questions/9780769/android-roboguice-inject-views-on-fragment и http://stackoverflow.com/questions/8289660/ any-simple-examples-using-roboguice-with-fragments-in-android –

+0

Да. Первый только указывает, что инъекция происходит во время onViewCreated, но я не знаю, как это сделать. Во втором я также попробовал RoboGuice.getInjector (getActivity()). InjectViewMembers (this); , но это не помогло. –

ответ

14

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

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

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

+1

Правильный ответ здесь ... – Snicolas

+0

Хорошо, вы правы. Я не принимал ответ все это время, потому что я все еще получал нулевой указатель, но по другой причине (я устанавливал кнопку прослушивателя кнопок в onCreateView). Я прошу прощения за мою задержку. –

+0

, хотя @ContextView не работал ... возможно, вы знаете, возможно ли это? –

-3

Вы должны вернуться вид. После 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; 
} 
+1

Это не решит 'NullPointerException'. Но вы правы, OP забыл о возвращении в своем вопросе (не в своем реальном коде). – jelies

+1

Действительно. Я отредактировал фрагмент кода. –

+0

Если это работает, можете ли вы подтвердить ответ, пожалуйста? – Tsunaze