Приложение зависает навсегда, когда отображается Fragment get - PullRequest
0 голосов
/ 04 декабря 2018

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

Фрагмент:

public class StatisticsFragment extends Fragment {

private TabLayout mTabLayout;
private ViewPager mViewPager;

private BankAccountsStatisticsFragment bankAccountsStatisticsFragment = new BankAccountsStatisticsFragment();
private BillsStatisticsFragment billsStatisticsFragment = new BillsStatisticsFragment();
private CategoriesStatisticsFragment categoriesStatisticsFragment = new CategoriesStatisticsFragment();
private GoalsStatisticsFragment goalsStatisticsFragment = new GoalsStatisticsFragment();


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View inflatedView = inflater.inflate(R.layout.fragment_statistics, container, false);

    mTabLayout = (TabLayout) inflatedView.findViewById(R.id.tl_statistics);
    mViewPager = (ViewPager) inflatedView.findViewById(R.id.vp_statistics);

    mViewPager.setAdapter(new Adapter(getChildFragmentManager()));
    mTabLayout.setupWithViewPager(mViewPager);

    return inflatedView;
}

private class Adapter extends FragmentPagerAdapter {

    private static final int TABS = 4;

    public Adapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position){
            case 0: return bankAccountsStatisticsFragment;
            case 1: return billsStatisticsFragment;
            case 2: return categoriesStatisticsFragment;
            case 3: return goalsStatisticsFragment;
            default: throw new IllegalStateException("Couldn't find a fragment for position " + position);
        }
    }

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position){
            case 0: return getString(R.string.tab_bank_accounts);
            case 1: return getString(R.string.tab_bills);
            case 2: return getString(R.string.tab_categories);
            default: return getString(R.string.tab_goals);
        }
    }

    @Override
    public int getCount() {
        return TABS;
    }
}

}

LOGCAT

LOGCAT

1 Ответ

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

Раздувание макета и создание перехода фрагмента (например, «FragmentManager .... replace (). Commit ()») выполняются в MainThread, где отображается UserInterface, поэтому в эти моменты UserInterface будет зависать.Я думаю, вам нужно предварительно загрузить «плохой» фрагмент и просто скрыть его, а не уничтожить… таким образом, когда вы захотите создать его в следующий раз, он уже готов.

...