My MainActivity загружает фрагмент (всего их 3, контролируемых BottomNavigationBar).Каждый фрагмент получает данные от LocalBroadcastManager , который отправляется из AsyncTask (поскольку он должен выполнять некоторые сетевые задачи), который инициализируется из NotificationListenerService (он получаетнемного музыкальной информации).
Изначально я загрузил все представления непосредственно в MainActivity, и они хорошо работали , но, поскольку они представляют собой три разных типа информации, я решил разделить их на фрагменты.Теперь только фрагмент, который показывается, получает данные.Если я переключаюсь на другой фрагмент, он ничего не показывает, пока NotificationListenerService снова не инициализирует задачи (это происходит только при изменении состояния музыки).И если я вернусь к фрагменту, который показывал данные, теперь он не показывает их тоже.
Вот код одного из моих фрагментов (три следуют той же структуре):
String[] lastFmResults;
String[] lastFmKodes;
String[] lastFmDescriptions;
LinearLayout lastFmCards;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_last_fm, container, false);
lastFmCards = (LinearLayout) view.findViewById(R.id.last_fm_cards);
LocalBroadcastManager.getInstance(getContext()).registerReceiver(broadcastReceiverLastFm, new IntentFilter("LastFM"));
return view;
}
private BroadcastReceiver broadcastReceiverLastFm = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle extras = intent.getExtras();
lastFmResults = extras.getStringArray("values");
lastFmKodes = extras.getStringArray("names");
lastFmDescriptions = extras.getStringArray("descriptions");
updateLastFmCards();
}
};
А вот мой MainActivity:
ColorsFragment colorsFragment;
LyricsFragment lyricsFragment;
LastFmFragment lastFmFragment;
BottomNavigationView bottomNavigationView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (!isNotificationServiceRunning()) {
startActivity(new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"));
}
colorsFragment = new ColorsFragment();
lyricsFragment = new LyricsFragment();
lastFmFragment = new LastFmFragment();
bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnNavigationItemSelectedListener(menuItem -> {
Fragment fragment = null;
switch (menuItem.getItemId()) {
case R.id.nav_colors:
fragment = colorsFragment;
break;
case R.id.nav_lyrics:
fragment = lyricsFragment;
break;
case R.id.nav_last_fm:
fragment = lastFmFragment;
break;
}
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
return true;
});
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, colorsFragment).commit();
}
Я ожидаю, что фрагменты загрузят отправленные им данные, даже если они еще не отображаются в MainActivity.