将FragmentPagerAdapter与ArrayAdapter一起使用时出现IllegalStateException

时间:2014-04-17 07:38:56

标签: android android-arrayadapter

我正在根视图上构建一个包含3个标签的应用。我想包括滑动以更改选项卡功能,因此我使用Android培训文档中建议的支持框架和FragmentPagerAdapter。使用自定义适配器构建我的前两个选项卡没有问题。但是,当我使用ArrayAdapter添加第三个选项卡时,在选项卡之间更改两次以上会生成IllegalStateException。

04-17 17:17:13.792: E/AndroidRuntime(2158): FATAL EXCEPTION: main
04-17 17:17:13.792: E/AndroidRuntime(2158): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.view.ViewGroup.addViewInner(ViewGroup.java:3509)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.view.ViewGroup.addView(ViewGroup.java:3380)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.view.ViewGroup.addView(ViewGroup.java:3325)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.view.ViewGroup.addView(ViewGroup.java:3301)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1280)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:672)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.support.v4.view.ViewPager$3.run(ViewPager.java:244)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.view.Choreographer.doCallbacks(Choreographer.java:562)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.view.Choreographer.doFrame(Choreographer.java:531)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.os.Handler.handleCallback(Handler.java:730)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.os.Looper.loop(Looper.java:137)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at android.app.ActivityThread.main(ActivityThread.java:5103)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at java.lang.reflect.Method.invokeNative(Native Method)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at java.lang.reflect.Method.invoke(Method.java:525)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
04-17 17:17:13.792: E/AndroidRuntime(2158):     at dalvik.system.NativeStart.main(Native Method)

正如你所看到的,这不是我的代码,只是Android库代码。有人知道如何解决它吗?我一直在尝试在这个论坛上找到的所有内容,但对我来说没有任何作用。

public class PreciousTrackerPagerAdapter extends FragmentPagerAdapter {

public static final int TAB_COUNT = 3;
public static final int TAB_PRECIOUS_MOVES = 0;
public static final int TAB_PRECIOUS_ITEMS = 1;
public static final int TAB_PRECIOUS_CATEGORY = 2;

private PreciousMovesFragment movesFragment;
private PreciousItemsFragment itemsFragment;
private PreciousCategoryFragment categoryFragment;

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

@Override
public Fragment getItem(int index) {
    switch (index) {
    case TAB_PRECIOUS_MOVES:
        if (movesFragment == null) {
            movesFragment = new PreciousMovesFragment();
        }
        return movesFragment;
    case TAB_PRECIOUS_ITEMS:
        if (itemsFragment == null) {
            itemsFragment = new PreciousItemsFragment();
        }
        return itemsFragment;
    case TAB_PRECIOUS_CATEGORY:
        if (categoryFragment == null) {
            categoryFragment = new PreciousCategoryFragment();
        }
        return categoryFragment;
    default:
        return null;
    }
}

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


}

我添加到第三个标签中的片段似乎在这里引起了问题。

public class PreciousCategoryFragment extends Fragment {

private List<PreciousCategory> categoryList;
private View rootView;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);

    if (rootView == null) {
        rootView = inflater.inflate(R.layout.category_list, null);
    }

    return rootView;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    refreshList();
}

private void refreshList() {
    PreciousTrackerModel model = PreciousTrackerModel.getInstance(getActivity());
    categoryList = model.getCategoryList();
    ArrayAdapter<PreciousCategory> adapter = new ArrayAdapter<PreciousCategory>(getActivity(), android.R.layout.simple_list_item_1, categoryList);
    ListView listView = (ListView) getActivity().findViewById(R.id.lstCategory);
    listView.setAdapter(adapter);
}

}

我是如何在主要活动中添加标签的。每个选项卡都占用整个内容空间。

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    model = PreciousTrackerModel.getInstance(this);

    pagerAdapter = new PreciousTrackerPagerAdapter(getSupportFragmentManager());
    viewPager = (ViewPager) findViewById(R.id.pager);
    viewPager.setAdapter(pagerAdapter);
    viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        public void onPageSelected(int position) {
            // When swiping between pages, select the
            // corresponding tab.
            getActionBar().setSelectedNavigationItem(position);
        }
    });

    // enable tabs in action bar
    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    // add tabs with listener
    actionBar.addTab(actionBar.newTab().setText(R.string.moves).setTabListener(this));
    actionBar.addTab(actionBar.newTab().setText(R.string.items).setTabListener(this));
    actionBar.addTab(actionBar.newTab().setText(R.string.category).setTabListener(this));
}

2 个答案:

答案 0 :(得分:2)

我认为PreciousCategoryFragment :: onCreateView是你的问题。

它应该是这样的:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_messages, null, false);
}

答案 1 :(得分:1)

您问为什么只有当您有3个或更多标签时才会发生这种情况,而不是当您有2个标签时。

这是因为当你有2个标签时,它们会在onCreateView和onResume上初始化,直到活动的开始!如果切换标签,它们就不再被调用了!

因为当你进入选项卡时,Android会加载邻居!因此触发onCreateView,onResume等。但如果你有2个标签,它们将始终相邻!

现在,如果您有3个标签,则第三个标签不会立即加载! 它会在你切换到它时加载到第二个,即相邻的!

原因因为android这样做很简单。如果下一个没有准备好,它就无法进行“滑动效果”!