2012-06-12 4 views
6

У меня есть activity с двумя fragments. Я не использую <fragment/> тегов, у меня есть два класса, которые распространяются Fragment, в этом фрагменте, у меня есть:Фрагменты и широковещательные приемники

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.bfragment, container, false); // this will inflate the Fragment in activity. 
    } 

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

Один из моих радиовещательного приемника, определенного в моей основной актив- ности является:

private BroadcastReceiver bcReceived = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context arg0, Intent intent) { 
      Log.d("", "BC Object Received"); 

      ActionBar actionbar = getActionBar(); 
      actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
      ActionBar.Tab bTab = actionbar.newTab().setText("B"); 
      Fragment fragment = new BFragment(); 
      bTab.setTabListener(new MyTabsListener(fragment)); 
      actionbar.addTab(bTab, true); 

      final LinearLayout linearLayout = (LinearLayout) findViewById(R.id.bTable); // Getting null pointer exception here. linearLayout is not getting initialized. 

Я хочу использовать выше LinearLayout и использовать его, чтобы раздуть представление в нем. Но получение NPE.

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

Мой вопрос: Как и где следует обновлять фрагмент? Должно ли это быть внутри моей деятельности? если да, то в каком методе? если нет, то где я должен обновить фрагмент?

Пожалуйста, помогите мне !!!

+0

Макет (R.layout.bfragment) одинаковый для двух фрагментов? Есть ли R.id.bTable в обоих фрагментах или нет? –

+0

, если вы спрашиваете, похоже ли обе схемы компоновки, а затем нет. Но оба макета завышены в одном контейнере, заменив предыдущий макет. – Shrikant

+0

R.id.bTable - это ваш контейнер? –

ответ

25

Ваша логика активности должна быть отделена от логики фрагментов.

Ваша деятельность должна справиться с логикой, как:

Мне нужно, чтобы отобразить этот фрагмент вместо этого один

Но ваша деятельность не должен обрабатывать такую ​​логику :

мне нужно обновить то, что внутри фрагмента

Ответственность фрагмента обновить его содержимое. С другой стороны, действие может сообщать фрагменту, что ему необходимо обновить себя.

Имея это в виду, ваши фрагменты должны разоблачить методы, такие как

updateContent(With Blabla) 

ИЛИ

updateContent() 

В вашей деятельности, когда BroadcastReceiver получает то, что вам необходимо:

  • Проверьте, какие фрагмент в настоящее время отображается
  • Подготовьте содержимое для обновления в фрагменте
  • Попросите фрагмент обновить с помощью метода updateContent(With Blabla).

ИЛИ

  • Проверьте, какой фрагмент отображается в данный момент
  • Задать фрагмент, чтобы обновить себя с помощью метода updateContent().

Выберите самый простой способ в соответствии с бизнес-логикой приложения.

+0

Спасибо за ваш ответ Тимоти Джиннин. Позвольте мне реализовать его таким образом. – Shrikant

+0

Не проблема, не стесняйтесь спросить, нужны ли вам дополнительные пояснения. Удачи с вашим проектом. :) –

+0

Большое вам спасибо. – Shrikant

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