Обратный вызов фрагмента для другого действия с фрагментом, приводит к нулевому указателю на представлениях фрагментов

Итак, у меня есть Activity (назовем его A) с пейджером просмотра и 3 фрагментами, один из этих фрагментов (назовем его фрагментом A) загружает список. Список onclickitem этого списка вызовет обратный вызов для действия (A), поэтому он запустит новое действие (назовем его B) с новым фрагментом (также B):

Фрагмент (A) со списком, содержащий интерфейс и onclickItemListener ():

// Container Activity must implement this interface
public interface onProcessSelectedListener{

    public void onMyProcessSelected(MyProcessDTO process);
}

actualListView.setOnItemClickListener(
                new OnItemClickListener() {

                    @Override
                    public void onItemClick(AdapterView<?> parent, View view,
                            int position, long id) {

                        IpdmsMobileMenuItemListDTO dto=(IpdmsMobileMenuItemListDTO) parent.getItemAtPosition(position);

                        if(getView().findViewById(R.id.myprocessdetail)!=null)
                            updateProcess((MyProcessDTO) dto.getDto());
                        else{

                            mListener.onMyProcessSelected((MyProcessDTO) dto.getDto());
                        }
                    }
                });

Если макет не отображает конкретное представление, он запустит метод обратного вызова для Activity (A), в котором находится пейджер представлений с этим фрагментом:

@Override
public void onMyProcessSelected(MyProcessDTO process) {

    Intent showContent = new Intent(getApplicationContext(),MyProcessDetail.class);
    showContent.putExtra("Process", process);
    startActivity(showContent);
}

Что вызовет новую активность (B):

@Override
public void onCreate() {

    this.setTheme(getThemeId());
    super.onCreate(bundle);

    //get extras from bundle
    extras = getIntent().getExtras();
    //requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

    setContentView(getLayoutId());

    MyProcessDTO process= (MyProcessDTO) extras.get("Process");

    //get fragment
    MyProcessDetailsFragment contentProcess= (MyProcessDetailsFragment) getSupportFragmentManager()
    .findFragmentById(R.id.view_fragment);

    contentProcess.updateProcess(process);
}

Макет, загруженный в Activity (B), содержит тег фрагмента, который указывает на класс Fragment (B). Activity (B) вызывает метод updateProcess () фрагмента (B):

public void updateProcess (процесс MyProcessDTO) {

    nrProcTV.setText(process.getNrprocesso());
    tipoTV.setText(process.getVariante());
}

Но по какой-то причине эти текстовые представления являются нулевыми. Они инициализируются методом onActivityCreated фрагмента (B) .:

@Override
public void initializeFragment(Bundle savedInstanceState) {

    super.initializeFragment(savedInstanceState);

    nrProcTV=   (TextView) getView().findViewById(R.id.nrprocesso_value);
    tipoTV= (TextView) getView().findViewById(R.id.tipoprocesso_value);

}

Почему метод onActivityCreated не был выполнен до вызова метода updateProcess ??

С уважением,

.


person Maxrunner    schedule 20.06.2012    source источник


Ответы (1)


TextView равны нулю, потому что вы обращаетесь к ним до того, как фрагмент прошел через onViewCreated (). Вы можете решить свою проблему, установив поле Activity во фрагменте и позволив фрагменту использовать это поле для view.setText в своем методе onViewCreated.

person Christine    schedule 20.06.2012
comment
Если это правда, то getView (). FindViewById не будет работать, и это так. Кажется, что метод onActivityCreated не завершен, когда я вызываю метод фрагмента из Activity onCreate ??? - person Maxrunner; 20.06.2012