java .lang.IllegalStateException: уже присоединено к androidx.fragment.app.FragmentManagerImpl.attachController - - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть viewpager с несколькими страницами, количество которых зависит от ответа. Каждый фрагмент имеет переработанное представление с элементами сетки. Похоже, при установке приложения Viewpager происходит сбой. Я не могу отследить, почему происходит cra sh и номер строки.

Код:

 adapter = new NewCatPagerAdapter(getSupportFragmentManager(), categoriesResponse.categories);
        for (int i = 0; i < categoriesResponse.categories.size(); i++) {
            NewCategoriesFragment3 categoriesFragment = new NewCategoriesFragment3();
            Bundle bundle = new Bundle();
            bundle.putInt(IntentParams.CATEGORIES_POSITION, i);
            bundle.putBoolean(IntentParams.IS_FOR_RESULT, isForResult);
            bundle.putBoolean(IntentParams.IS_CROSS_BORDER, isCrossBorder);
            categoriesFragment.setArguments(bundle);
            adapter.addFragment(categoriesFragment);
        }
        setUpCategoryTitle(categoriesResponse.categories);


        vpPager = findViewById(R.id.viewPager);
        vpPager.setClipToPadding(false);
        vpPager.setPageMargin(12);
        vpPager.setOffscreenPageLimit(categoriesResponse.categories.size());
        vpPager.setAdapter(adapter);

Stacktrace:

java.lang.IllegalStateException: Already attached
        at androidx.fragment.app.FragmentManagerImpl.attachController(FragmentManagerImpl.java:2560)
        at androidx.fragment.app.Fragment.performAttach(Fragment.java:2553)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:828)
        at androidx.fragment.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1197)
        at androidx.fragment.app.FragmentTransition.calculateFragments(FragmentTransition.java:1080)
        at androidx.fragment.app.FragmentTransition.startTransitions(FragmentTransition.java:119)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1863)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1821)
        at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManagerImpl.java:1696)
        at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:299)
        at androidx.fragment.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:256)
        at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
        at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)
        at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1622)
        at android.view.View.measure(View.java:25086)
        at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1185)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:723)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6872)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at com.android.internal.policy.DecorView.onMeasure(DecorView.java:742)
        at android.view.View.measure(View.java:25086)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3083)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1857)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2146)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1745)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7768)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:967)
        at android.view.Choreographer.doCallbacks(Choreographer.java:791)
   at android.view.Choreographer.doFrame(Choreographer.java:726)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:952)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

NewCatPagerAdapter:

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;

import java.util.ArrayList;
import java.util.List;



// Extend from SmartFragmentStatePagerAdapter now instead for more dynamic ViewPager items
public class NewCatPagerAdapter extends FragmentStatePagerAdapter {
    private static int NUM_ITEMS = 2;
    private ArrayList<Fragment> mFragmentList = new ArrayList<>();
    private List<Category> titleList = new ArrayList<>();


    public NewCatPagerAdapter(FragmentManager fragmentManager, List<Category> titleList) {
        super(fragmentManager);
        this.titleList = titleList;
    }

    // Returns total number of pages
    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    // Returns the fragment to display for that page
    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    public void addFragment(Fragment fragment) {
        mFragmentList.add(fragment);
    }

    // Returns the page title for the top indicator
    @Override
    public CharSequence getPageTitle(int position) {
        return titleList.get(position).displayName;
    }

}

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

Для тестирования я пытаюсь выяснить вашу проблему, но у меня отлично работает! Вот код:

public class MainActivity extends AppCompatActivity {

    ViewPager vpPager;
    CatPagerAdapter adapter;
    List<String>list  = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        vpPager = findViewById(R.id.viewPager);
        list.add("One");
        list.add("Two");
        list.add("Three");
        list.add("Four");
        list.add("Five");
        adapter = new CatPagerAdapter(getSupportFragmentManager(), list);
        for (int i = 0; i < 4; i++) {
            FirstFragment categoriesFragment = new FirstFragment();
            Bundle bundle = new Bundle();

            adapter.addFragment(categoriesFragment);
        }
        //setUpCategoryTitle(categoriesResponse.categories);


        vpPager = findViewById(R.id.viewPager);
        vpPager.setClipToPadding(false);
        vpPager.setPageMargin(12);
        vpPager.setOffscreenPageLimit(5);
        vpPager.setAdapter(adapter);
    }
}

Расположение:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

Адаптер:

public class CatPagerAdapter extends FragmentStatePagerAdapter {

    private static int NUM_ITEMS = 2;
    private ArrayList<Fragment> mFragmentList = new ArrayList<>();
    private List<String> titleList = new ArrayList<>();

    public CatPagerAdapter(@NonNull FragmentManager fm, List<String>list) {

        super(fm);
        titleList = list;
    }


    @NonNull
    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }


    public void addFragment(Fragment fragment) {
        mFragmentList.add(fragment);
    }


    @Override
    public CharSequence getPageTitle(int position) {
        return "";
    }

}
0 голосов
/ 04 февраля 2020

Неясно, что такое NewCatPagerAdapter, но значение categoriesResponse.categories.size() не учитывает наличие текущей страницы:

vpPager.setOffscreenPageLimit((adapter.getCount() > 1 ? adapter.getCount() - 1 : 1);
...