Как правильно загрузить фрагмент из меню параметров? - PullRequest
0 голосов
/ 22 июня 2019

Так что мне нужно меню опций, которое будет одинаковым для всех моих фрагментов.Этот код работает для выбора и загрузки фрагмента из меню параметров.Однако, как мы все знаем, только то, что что-то работает, не означает, что это правильный способ сделать это.

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

            Fragment fragment = null;

            switch (item.getItemId()) {
                    case R.id.navigation_home:
                            fragment = new HomeFragment();
                            break;

                    }

Любая обратная связь будет очень благодарна.Также в качестве дополнительного вопроса, в какой момент вы используете новый вид деятельности?

Ответы [ 2 ]

1 голос
/ 22 июня 2019

Если вам нужно перезагружать данные в этом фрагменте каждый раз, когда вы их загружаете, то это правильный путь.

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

заменить фрагмент следующим образом:

MyFragment fragment  = new MyFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.place_holder,fragment,"myFragmentTag");
fragmentTransaction.commit();

Оберните вышеуказанный код в эту if скобку.

fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag("myFragmentTag");
if(fragment == null){
    // ok, fragment is not already exists, so load it once.
} else {
   // Pop fragments to this tag

    fm = getSupportFragmentManager();
    for (int i = 0; i < getSupportFragmentManager().getBackStackEntryCount()-1; i--) {
        if (!fm.getBackStackEntryAt(i).getName().equalsIgnoreCase(newFragTag)){
            fm.popBackStack();
        } else {
            break;
        }
    }
}

итоговый код выглядит так:

FragmentManager fragmentManager = getSupportFragmentManager();
fragment = (MyFragment) fragmentManager.findFragmentByTag("myFragmentTag");
if(fragment == null){
    // ok, fragment is not already exists, so load it once.

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.place_holder,fragment,"myFragmentTag");
    fragmentTransaction.commit();
} else {
   // Pop fragments to this tag
    for (int i = 0; i < fragmentManager.getBackStackEntryCount()-1; i--) {
        if (!fragmentManager.getBackStackEntryAt(i).getName().equalsIgnoreCase("myFragmentTag")){
            fragmentManager.popBackStack();
        } else {
            break;
        }
    }
}
0 голосов
/ 22 июня 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...