在Transaction.remove()之后,Fragment中的ViewPager消失了(维护实例?)

时间:2012-06-11 20:45:01

标签: android android-fragments android-viewpager fragmenttransaction

我正在使用带有v4软件包的Google API 8(Android 2.2)。

嗨,这是我的问题:

我有一个FragmentActivity,它有一个总是停留在屏幕上的菜单和一个小容器(一个FrameLayout),我放了许多片段。当我隐藏并显示片段时,我的应用程序工作正常,但是在我加载所有片段后崩溃,因为我使用的内存有限。在这种情况下,我必须在加载其他片段时删除一些片段,因此应用程序不会崩溃。但是这里出现了另一个问题,我删除后我的寻呼机没有重新加载,所有其他片段工作正常。只有我的寻呼机没有显示,它们不会崩溃,只是消失。这里有一些代码可以帮助您了解我的问题:

MyFragmentActivity.java具有以下布局:

 <LinearLayout

        ...(some code from menu that doesn't matter)

        <FrameLayout
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </FrameLayout>
    </LinearLayout>

在那个FrameLayout中,我把所有碎片都放了。寻呼机片段就是其中之一,其布局如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <android.support.v4.view.ViewPager
        android:id="@+android:id/some_pager"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
</LinearLayout>

我实现了这个抽象类 AbstractPagerFragment

import java.util.List;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public abstract class AbstractPagerFragment extends Fragment {


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View fragment = inflater.inflate(getLayoutID(), container,false);
        PagerAdapter mPagerAdapter = initializePager();
        ViewPager pager = (ViewPager) fragment.findViewById(getPagerID());
        pager.setAdapter(mPagerAdapter);
        return fragment;
    }

    private PagerAdapter initializePager() {
        PagerAdapter mPagerAdapter = new templateDigital.util.PagerAdapter(getFragmentManager(), getFragments());
        return mPagerAdapter;

    }

    public abstract List<Fragment> getFragments();

    public abstract int getLayoutID();

    public abstract int getPagerID();

}

这使用我的 PagerAdapter ,如下所示:

import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class PagerAdapter extends FragmentPagerAdapter{

    private List<Fragment> fragments;

    public PagerAdapter(FragmentManager fManager, List<Fragment> fragments) {
        super(fManager);
        this.fragments = fragments;
    }


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


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

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
}

现在,让我们实现 AbstractPagerFragment

import templateDigital.main.R;
import templateDigital.util.fragments.AbstractPagerFragment;
import templateDigital.util.fragments.GenericFragment;
import android.support.v4.app.Fragment;

public class ConcretePagerFragment extends AbstractPagerFragment {

    private List<Fragment> fragments;

    public ConcretePagerFragment() {
        fragments = new ArrayList<Fragment>();
        fragments.add(new GenericFragment(R.layout.concept_page1_fragment));
        fragments.add(new GenericFragment(R.layout.concept_page2_fragment));
        fragments.add(new GenericFragment(R.layout.concept_page3_fragment));

        //GenericFragments is a class that extends Fragments and just inflate a layout with a background image.
    }

    @Override
    public List<Fragment> getFragments() {
        return fragments;
    }

    @Override
    public int getLayoutID() {
        return R.layout.pager_fragment;
    }

    @Override
    public int getPagerID() {
        return R.id.some_pager; // the pager inside the layout
    }
}

好的,现在我从我的内容(FrameLayout)中添加它(myFragment是一个PagerFragment,而myTag是一个代表我定义的标签的字符串):

FragmentTransaction transaction = fragmentManager.beginTransaction();
    if (fragmentManager.findFragmentByTag(myTag) == null) {
        transaction.add(R.id.content,myFragment, myTag);
    }

    transaction.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
    hideAllOtherFragments(myTag, transaction); //Here I hide all other fragments, the code is okay. Trust me.
    transaction.show(myFragment());
    transaction.commit();

这就是我删除它的方式:

...
transaction.remove(myFragment);
...

但是当我导航回菜单中的片段之后应该再次加载时,使用我在第一次使用的相同方法(上面的代码),寻呼机不再显示。任何人都可以解决这个问题吗?

如果你读完所有这些,谢谢你,你是一个冠军。

1 个答案:

答案 0 :(得分:0)

实际上,如果要使用片段实现ViewPager,则应添加TabHost,TabWidget,FrameLayout和ViewPager。

TabHost将成为选项卡式窗口视图的容器。此对象包含两个子项:用户单击以选择特定选项卡的一组选项卡标签,FrameLayout是显示该页面内容的对象。在您必须创建TabAdapter(类似于PagerAdapter)之后,通过调用mTabsAdapter.addTab并将片段作为参数发送来为每个选项卡添加片段

我做了post about it,在那里我解释了如何整合Fragments和ViewPager。希望它有所帮助。