0

Как указывает вопрос, я пытаюсь вызвать метод Фрагмента из его родительской активности onCreate. Однако вызываемый метод дает исключение с нулевым указателем в фрагменте. Оскорбительная линия:Как вызвать метод Фрагмента после загрузки фрагмента?

getListView().setAdapter(aAdapter); 

Мое подозрение - getListView() еще не существует. Возможно, это пробел в моем знании жизненных циклов фрагмента/действия, но есть ли «AfterCreate» в Activity, который я мог бы использовать?

//Views 
private RelativeLayout vClassSettings; 
private LinearLayout vPeople; 
private LinearLayout vLinks; 
private RelativeLayout vAttendanceSettings; 

private static final String sTag = "ActivityClassEdit"; 



private Boolean insertMode; 
//==============On Create================ 
    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_classedit); 
     vClassSettings=(RelativeLayout) findViewById(R.id.ace_container_settings); 
     vPeople = (LinearLayout) findViewById(R.id.ace_container_people); 
     vLinks = (LinearLayout) findViewById(R.id.ace_container_links); 
     vAttendanceSettings = (RelativeLayout)  findViewById(R.id.ace_container_attendanceDetails); 
     insertMode=true; 
     startupFragments(); 
    } 

    /* 
     Sets modes for children fragments so that we do not get null adapters, be it Object or SQL related 
    */ 
    private void startupFragments(){ 
     instantiateFragments(); 
     if(insertMode){ 
      if(fLinkList==null){Log.d(sTag,"null fragment for LinkList");} 
      fLinkList.setArrayMode(); 
      fCrList.setArrayMode(); 
      fPersonList.setArrayMode(); 
     } else { 
      //TODO set CursorMode with parent class argument 
     } 

    } 

И метод обижая фрагмента:

public void setArrayMode(){ 
    aAdapter = new LinkArrayListAdapter(getActivity(), links); 
    getListView().setAdapter(aAdapter); 
    getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, 
       long id) { 
      final LinkTable.Link selectedLink = (Link) parent.getItemAtPosition(position); 
      selectedLink.setIndex(aAdapter.getPosition(selectedLink)); 
      App.getInstance().getEventBus().post(new FragmentEvent.LinkObjectLoad(selectedLink)); 
      //App.getInstance().getEventBus().post(arg0); 
     }});} 
+0

Отправьте код своей деятельности. –

+1

«Есть ли« AfterCreate »в Activity, который я мог бы использовать?». Да, Activity.onPostCreate() –

+0

@Gil +1. Также 'onResumeFragments()'. – kcoppock

ответ

3

Я хотел бы предложить, что вы никогда не коснитесь Просмотр фрагмента снаружи самого фрагмента. Фрагмент должен создать его Вид в onCreateView(), захватить просмотр ссылок и инициализировать представление в onViewCreated() и отпустить его в onDestroyView(). Если вам необходимо предоставить ему данные после того, как он создан, вы можете либо:

  1. Обеспечить метод в фрагменте, чтобы установить данные для адаптера. Если представление еще не создано, данные должны быть взяты, когда Фрагмент устанавливает адаптер. В противном случае фрагмент может обновить свой адаптер новыми данными.

  2. Предоставьте данные как аргументы фрагмента (Fragment.setArguments(Bundle)) и установите фрагмент в списке: onViewCreated() с getArguments().get{someDataType}().

EDIT: Так аргументированно фрагменту:

public static MyListFragment newInstance(int type, ArrayList<? extends Parcelable> items) { 
    MyListFragment fragment = new MyListFragment(); 
    Bundle args = new Bundle(); 
    args.putInt(TYPE_ARG, type); 
    args.putParcelableArrayList(ITEMS_ARG, items); 
    fragment.setArguments(args); 
    return fragment; 
} 

public void onViewCreated(View view, Bundle savedInstanceState) { 
    final int type = getArguments().getInt(TYPE_ARG); 

    if (type == FIRST_TYPE) { 
     // Set first type adapter 
    } else /* Some other type of argument */ { 
     // Set another adapter type 
    } 
} 

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

+0

Я ценю ваш быстрый ответ. Дело не в том, что представления не связаны с Activity, а в зависимости от аргументов Activity, ListFragment должен установить правильный адаптер. –

+0

См. Обновленный ответ. – kcoppock

+1

Ваше намерение не возиться с представлением фрагмента из Activity корректно. К сожалению, мои фрагменты встроены в XML-макет Activity, поэтому мне придется использовать eventbus. Тем не менее, ваша логика будет по-прежнему использоваться, без пучков. Спасибо, что расширили знания незнакомца в Android –

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