Как заставить фрагменты загружать данные из сервиса еще до того, как они будут отображены в основном действии? - PullRequest
0 голосов
/ 30 декабря 2018

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.

1 Ответ

0 голосов
/ 30 декабря 2018

Я решил это, следуя этому руководству: https://medium.com/@oluwabukunmi.aluko/bottom-navigation-view-with-fragments-a074bfd08711

Вместо replace () он говорит, что я должен использовать show () и hide ().Я только должен был изменить мою MainActivity:

final ColorsFragment colorsFragment = new ColorsFragment();
final LyricsFragment lyricsFragment = new LyricsFragment();
final LastFmFragment lastFmFragment = new LastFmFragment();

final FragmentManager fragmentManager = getSupportFragmentManager();
Fragment activeFragment = colorsFragment;

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"));
    }

    bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation);
    bottomNavigationView.setOnNavigationItemSelectedListener(menuItem -> {

        switch (menuItem.getItemId()) {
            case R.id.nav_colors:
                fragmentManager.beginTransaction().hide(activeFragment).show(colorsFragment).commit();
                activeFragment = colorsFragment;
                break;
            case R.id.nav_lyrics:
                fragmentManager.beginTransaction().hide(activeFragment).show(lyricsFragment).commit();
                activeFragment = lyricsFragment;
                break;
            case R.id.nav_last_fm:
                fragmentManager.beginTransaction().hide(activeFragment).show(lastFmFragment).commit();
                activeFragment = lastFmFragment;
                break;
        }

        return true;
    });

    fragmentManager.beginTransaction().add(R.id.fragment_container, lastFmFragment, "2").hide(lastFmFragment).commit();
    fragmentManager.beginTransaction().add(R.id.fragment_container, lyricsFragment, "1").hide(lyricsFragment).commit();
    fragmentManager.beginTransaction().add(R.id.fragment_container, colorsFragment, "0").commit();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...