2014-10-28 3 views
0

У меня этот сценарий реализован там, где у меня есть ящик навигации с вложенными фрагментами, которые добавляются в задний стек с тегом. Каждый фрагмент имеет следующее внедрен:Трансляционные приемники и фрагменты

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    if (rootView == null) { 
     rootView = inflater.inflate(R.layout.fragment_feed, container, 
       false); 
     // Doing initialisaion here 
    } else { 
     ((ViewGroup) rootView.getParent()).removeView(rootView); 
    } 
    return rootView; 

Это был лучшим способом, которым я мог думать, чтобы сохранить свои списки внутри этих фрагментов и их динамические и колонтитулы (Думая о реализации нового подхода здесь уже).

Кроме того у меня есть эти трансляции, когда пользователь ложах из моего приложения, так что я обновить эти списки, или при изменении местоположения:

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
      locationBroadcastReciever, 
      new IntentFilter(UpdateLocationIntentService.LOCATION_CHANGED)); 
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
      significantBroadcastReciever, 
      new IntentFilter(UserDefaultsManager.SIGNIFICANT_CHANGED)); 
    // Further code here 
} 

на отсоединение вызывается, когда фрагмент отсоединяется:

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

Текущая реализация с проверкой nullpointer позволяет мне обновлять 4 фрагмента одновременно, когда пользователь вышел из системы (или зарегистрировался) или изменил местоположение, и ранее не было элементов в списке.

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

+0

Похоже, вы могли бы взглянуть на EventBus – cYrixmorten

+0

Или вы можете попробовать Otto, что альтернатива EventBus. –

+1

Благодарим вас за предложения. Я не думаю, что мы на правильном пути. События распространяются через мои фрагменты (это не проблема). Я сделал лучшее обходное решение, установив флаг, чтобы фрагмент был обновлен, и всякий раз, когда вызывается onResume, я бы сделал это обновление (таким образом, мне не нужно беспокоиться о том, что мои представления равны нулю). –

ответ

1

Мой случай был обновить текстовое поле в одном из фрагментов, размещенных на MainActivity.The простым решением я нашел это: -

В моем классе MainActivity извлекаться запущенный экземпляр MainActivtiy.This мой MAinActivity

private static MainActivity mainActivityRunningInstance; 
    public static MainActivity getInstace(){ 
     return mainActivityRunningInstance; 
    } 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mainActivityRunningInstance =this; 
---------- 
} 

Теперь в методе onRecieve Broadcast ресивер, получить этот экземпляр и вызвать метод обновления

@Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().matches(Intents.PROVIDER_CHANGED_ACTION)) { 
       String textValue="the text field value"; 
// the null check is for, if the activity is not running or in paused state, in my case the update was required onlyif the main activity is active or paused 
      if(MainActivity.getInstace()!=null) 
       MainActivity.getInstace().updateUI(textValue); 
} 

Теперь для годовых rt, где нам нужно запустить обновление в UIThread, метод updateUI MainActivity вызовет метод обновления фрагментов.

public void updateUI(final String str) { 
     MainActivity.this.runOnUiThread(new Runnable() { 
      public void run() { 
    //use findFragmentById for fragments defined in XML ((SimpleFragment)getSupportFragmentManager().findFragmentByTag(fragmentTag)).updateUI(str); 
      } 
     }); 
    } 

и заключительный этап обновления текстового поля фрагмента

public void updateUI(String str){ 
     tv_content.setText(str); 
    } 

и Бинго, его сделали. Я ответил post, чтобы решить мою проблему. Надеюсь, что это поможет другим.

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