Android 两次显示contet的片段

Android 两次显示contet的片段,android,android-fragments,Android,Android Fragments,我将解释我的应用程序的结构: 活动-->片段A(在该片段(A)中,我有3个片段(B、C、D)(viewpager))-->在第一个片段(B)中,它包含一个listview。该列表中的每个项目都会启动一个片段E。 所以我在这里面临一个问题 当我第一次启动应用程序时,一切看起来都很好 但是当片段E get在屏幕上可见时,选项卡变得很奇怪,就像: 是的!他们被复制了。 当我单击listview时,我提交了活动中回调的2个片段之间的转换: transaction = getSupportFr

我将解释我的应用程序的结构:

活动-->片段A(在该片段(A)中,我有3个片段(B、C、D)(viewpager))-->在第一个片段(B)中,它包含一个listview。该列表中的每个项目都会启动一个片段E。

所以我在这里面临一个问题

当我第一次启动应用程序时,一切看起来都很好

但是当片段E get在屏幕上可见时,选项卡变得很奇怪,就像:

是的!他们被复制了。 当我单击listview时,我提交了活动中回调的2个片段之间的转换:

    transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.content_frame, PF);
    transaction.addToBackStack(null);
    transaction.commit();
public class MainActivity extends FragmentActivity implements
        IslamToolsFragment.OnToolsSelectedListener {
    FragmentTransaction transaction;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (findViewById(R.id.content_frame) != null) {
            if (savedInstanceState != null) {
                return;
            }

            PagerActivity firstFragment = new PagerActivity();

            getSupportFragmentManager().beginTransaction()
                    .add(R.id.content_frame, firstFragment).commit();
        }
    }

    @Override
    public void OnToolSelected(int position) {
        // TODO Auto-generated method stub
        switch (position) {
        case 0:
            PrayerFragment PF = new PrayerFragment();
            transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.content_frame, PF);
            transaction.addToBackStack(null);
            transaction.commit();
            break;
        case 1:
            QiblaFragment QF = new QiblaFragment();
            transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.content_frame, QF);
            transaction.addToBackStack(null);
            transaction.commit();
            break;
        }
    }
当我想回到前面的片段时:

        getFragmentManager().popBackStack();
上一个片段是否正在重新创建?我能做些什么来解决这个问题呢

更新——代码: 活动:

    transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.content_frame, PF);
    transaction.addToBackStack(null);
    transaction.commit();
public class MainActivity extends FragmentActivity implements
        IslamToolsFragment.OnToolsSelectedListener {
    FragmentTransaction transaction;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (findViewById(R.id.content_frame) != null) {
            if (savedInstanceState != null) {
                return;
            }

            PagerActivity firstFragment = new PagerActivity();

            getSupportFragmentManager().beginTransaction()
                    .add(R.id.content_frame, firstFragment).commit();
        }
    }

    @Override
    public void OnToolSelected(int position) {
        // TODO Auto-generated method stub
        switch (position) {
        case 0:
            PrayerFragment PF = new PrayerFragment();
            transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.content_frame, PF);
            transaction.addToBackStack(null);
            transaction.commit();
            break;
        case 1:
            QiblaFragment QF = new QiblaFragment();
            transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.content_frame, QF);
            transaction.addToBackStack(null);
            transaction.commit();
            break;
        }
    }
片段A(包含3个片段):

公共类PagePractivity扩展片段实现ActionBar.TabListener{
int NUM_PAGES=5;
ActionBar ActionBar;
私人寻呼机;
应用分区SPAGERAAdapter映射分区SPAGERAAdapter;
@凌驾
SaveInstanceState上的公共无效(束超出状态){
super.onSaveInstanceState(超出状态);
mPager.setAdapter(空);
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onActivityCreated(savedInstanceState);
如果(savedInstanceState!=null){
返回;
}否则{
actionBar=this.getActivity().getActionBar();
actionBar.setNavigationMode(actionBar.NAVIGATION\u MODE\u选项卡);
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setDisplayShowTitleEnabled(false);
mAppSectionsPagerAdapter=新的AppSectionsPagerAdapter(
getChildFragmentManager());
mPager.setAdapter(mAppSectionsPagerAdapter);
int icons[]={R.drawable.ic_action_storage,
R.drawable.ic_action_overflow,R.drawable.ic_action_person};
mPager.setOnPageChangeListener(新的ViewPager.SimpleOnPageChangeListener(){
@凌驾
已选择页面上的公共无效(内部位置){
actionBar.setSelectedNavigationItem(位置);
}
});
对于(int i=0;i
Fragnent B:

public class IslamToolsFragment extends Fragment {
    OnToolsSelectedListener mCallback;

    ListView islamtools;
    Fragment PF = new PrayerFragment();

    public interface OnToolsSelectedListener {
        public void OnToolSelected(int position);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View islamtoolsview = inflater.inflate(R.layout.lvislamtools,
                container, false);
        if (savedInstanceState != null) {
            return islamtoolsview;
        }
        islamtools = (ListView) islamtoolsview.findViewById(R.id.lvislamtools);
        String[] title = { "Prayer Times", "Qibla", "Ahadith", "Quran",
                "Hijri Calendar", "99 Names" };
        IslamToolsAdapter ITA = new IslamToolsAdapter(this.getActivity(), title);
        islamtools.setAdapter(ITA);
        islamtools.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                // TODO Auto-generated method stub
                mCallback.OnToolSelected(arg2);
            }

        });
        return islamtoolsview;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mCallback = (OnToolsSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }

    }
公共类IslamToolsFragment扩展片段{
OnToolsSelectedListener McCallback;
列表视图工具;
片段PF=新的祈祷碎片();
OLSSelectedListener上的公共接口{
已选择公共位置(内部位置);
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
查看islamtoolsview=充气机。充气(R.layout.lvislamtools,
货柜(虚假);;
如果(savedInstanceState!=null){
返回伊斯兰工具视图;
}
islamtools=(ListView)islamtoolsview.findViewById(R.id.lvislamtools);
String[]title={“祈祷时间”、“朝拜”、“阿哈迪”、“古兰经”,
“回历”、“99个名字”};
IslamToolsAdapter ITA=新的IslamToolsAdapter(this.getActivity(),title);
islamtools.setAdapter(ITA);
islamtools.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共链接(AdapterView arg0、视图arg1、内部arg2、,
长arg3){
//TODO自动生成的方法存根
mCallback.OnToolSelected(arg2);
}
});
返回伊斯兰工具视图;
}
@凌驾
公共事务主任(活动){
超级转速计(活动);
试一试{
mCallback=(OnToolsSelectedListener)活动;
}catch(ClassCastException e){
抛出新的ClassCastException(activity.toString()
+“必须实现OnHeadlineSelectedListener”);
}
}

谢谢!这与savedinstancestate有关吗?

您的代码设计有点错误,片段实际上是活动的一部分,在这种情况下,创建一个包含更多片段的片段对我来说没有意义,您应该为viewpager创建一个活动,并将您的3帧放入该活动中恩茨

我有一个类似的应用程序,这就是我如何处理选项卡之间的导航:

pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
上述代码会更改操作栏中选定的项目,但不会更改“查看寻呼机”选项卡下的视图,您需要实现以下操作:

     @Override
     public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    pager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {

}

@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {

}

我需要用一个活动和许多片段来制作我的应用程序…在这种情况下,这对我没有帮助,但你可以做到这一点,而不是让一个活动包含另外3个片段的父亲,在你的主要活动中实现viewpager,然后从那里添加其他片段。除非你的应用程序更大…这是一个好主意e一点用处都没有?有时候我用片段B替换片段e…所以它们必须是片段。明白了吗?那么忘记我告诉过的关于活动的内容,试着用我的代码在选项卡中导航,我相信你现在的做法是实例化的片段比应该的多。