如何进行fragment中的来回切换?

本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术,本文为大家讲解如何进行fragment中的来回切换


问:Ijaz Ahmed

我想要对fragment中的fragment进行操作,在按后退按钮的时候出现了问题。应用程序主屏幕上有很多按钮,按下每个按钮都会出现新的fragment(它也被包含在另一个fragment内)。按下按钮1(已替换fragment),可以进行动态的添加或者是替换片段。如果按下按钮后,再去按它,就会得到:


1

2

"Duplicate id 0x7f05000a, tag null, or parent id 0x7f050009 with

another fragment for com........ fragmentname"

这意味着已经添加过fragment,有谁可以帮我完成fragment的相关设定,并顺利的完成来回切换?

如下是,MainActiviy的代码,它可以控制动态添加/替换fragment:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

public class FragmentInsideFragmentTestActivity extends Activity {

 private Button button1;

 private Button button2;

 private Button button3;

 private Button button4;

 /** Called when the activity is first created. */

@Override

 public void onCreate(Bundle savedInstanceState) {

 super.onCreate(savedInstanceState);

 setContentView(R.layout.main);

 button1 =(Button) this.findViewById(R.id.button1);

 button1.setOnClickListener(new View.OnClickListener() {

     public void onClick(View view) {

         onButtonClick(view);

         }

 });

 button2 =(Button) this.findViewById(R.id.button2);

 button2.setOnClickListener(new View.OnClickListener() {

     public void onClick(View view) {

         onButtonClick(view);

         }

 });

 button3 =(Button) this.findViewById(R.id.button3);

 button3.setOnClickListener(new View.OnClickListener() {

     public void onClick(View view) {

         onButtonClick(view);

         }

 });

 button4 =(Button) this.findViewById(R.id.button4);

 button4.setOnClickListener(new View.OnClickListener() {

     public void onClick(View view) {

         onButtonClick(view);

         }

 });

  }

 public void onButtonClick(View v) {

         Fragment fg;

         switch (v.getId()) {

         case R.id.button1:

                 fg=FirstFragment.newInstance();

                 replaceFragment(fg);

                 break;

         case R.id.button2:

                 fg=SecondFragment.newInstance();

                 replaceFragment(fg);

                 break;

         case R.id.button3:

                 fg=FirstFragment.newInstance();

                 replaceFragment(fg);

                 break;

         case R.id.button4:

                 fg=SecondFragment.newInstance();

                 replaceFragment(fg);

                 break;

         }

 }

 private void replaceFragment(Fragment newFragment) {

 FragmentTransaction trasection =

 getFragmentManager().beginTransaction();

 if(!newFragment.isAdded()){

         try{

                 //FragmentTransaction trasection =

         getFragmentManager().beginTransaction();

         trasection.replace(R.id.linearLayout2, newFragment);

         trasection.addToBackStack(null);

         trasection.commit();

         }catch (Exception e) {

                         // TODO: handle exception

                  //AppConstants.printLog(e.getMessage());

                 }

 }else

         trasection.show(newFragment);

    }

  }

如下是Layout : main.xml


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

  <LinearLayout android:id="@+id/linearLayout1"

          android:layout_width="match_parent"

          android:layout_height="wrap_content"

          android:orientation="horizontal">

          <Button android:layout_width="wrap_content"

                  android:id="@+id/button1"

                  android:layout_height="wrap_content"

                  android:text="Button1"></Button>

          <Button android:text="Button2"

                  android:id="@+id/button2"

                  android:layout_width="wrap_content"

                  android:layout_height="wrap_content"></Button>

          <Button android:text="Button3"

                  android:id="@+id/button3"

                  android:layout_width="wrap_content"

                  android:layout_height="wrap_content"></Button>

          <Button android:text="Button4"

                  android:id="@+id/button4"

                  android:layout_width="wrap_content"

                  android:layout_height="wrap_content"></Button>

  </LinearLayout>

 <LinearLayout android:id="@+id/linearLayout2"

  android:layout_width="match_parent"

   android:layout_height="wrap_content"

  android:orientation="horizontal"></LinearLayout>

    </LinearLayout>

以上就是我遇到的问题,希望大家可以为我解答。

答:CommonsWare

(最佳答案)

你可以用getChildFragmentManager()进行fragment嵌套操作,但这也意味着你的Android支持包版本的API级别要在11-16之间。主要是因为,即使在配置上存在fragment的自带版本,但是也未必可以支getChildFragmentManager()。

答:Napolean

fragment可以嵌套在其它的fragment中,但每次调用onDestroyView()时,你都需要从parent Fragment中删掉它,然后将它添加到OnCreateView()中的parent Fragment。具体方法如下:


1

2

3

4

5

6

7

8

9

10

@Override

    public void onDestroyView()

    {

                FragmentManager mFragmentMgr= getFragmentManager();

        FragmentTransaction mTransaction = mFragmentMgr.beginTransaction();

                Fragment childFragment =mFragmentMgr.findFragmentByTag("qa_fragment")

        mTransaction.remove(childFragment);

        mTransaction.commit();

        super.onDestroyView();

    }

答:Vetal.lebed

我的解决办法是,使用支持库(Support library)和ViewPager。你可以禁用一些不必要的程序,具体方法如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

public class TestFragment extends Fragment{

@Override

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

    View v = inflater.inflate(R.layout.frag, container, false);

    final ArrayList<Fragment> list = new ArrayList<Fragment>();

    list.add(new TrFrag());

    list.add(new TrFrag());

    list.add(new TrFrag());

    ViewPager pager = (ViewPager) v.findViewById(R.id.pager);

    pager.setAdapter(new FragmentPagerAdapter(getActivity().getSupportFragmentManager()) {

        @Override

        public Fragment getItem(int i) {

            return list.get(i);

        }

        @Override

        public int getCount() {

            return list.size();

        }

    });

    return v;

}

原文链接:http://stackoverflow.com/questions/6672066/fragment-inside-fragment?rq=1

http://android.9tech.cn/news/2013/1202/39041.html

如何进行fragment中的来回切换?

时间: 2024-07-28 21:52:03

如何进行fragment中的来回切换?的相关文章

Fragment碎片频繁来回切换的时候报java.lang.IllegalStateException: No activity

出现这个问题的原因是因为使用的transcation.replace(fragmentTwo);的方式进行碎片切换的. 解决方案是使用add和show.hide方法组合实现碎片的切换(应该是显示.隐藏). 我这里使用的是RadioButton控件的Id值. /** * 切换碎片:使用show和hide以及add,不要使用replace(频繁来回切换的时候容易发生内存溢出的错误) */ public void onTabSelected(int radioGroupId) { //开启一个事务 F

[Android Pro] Fragment中使用SurfaceView切换时闪一下黑屏的解决办法

方法一.在Activity的onCreate中添加如下代码 getWindow().setFormat(PixelFormat.TRANSLUCENT); reference to :  http://www.jb51.net/article/72719.htm

关于含RecyclerView的fragment来回切换时页面自动滑动到底部的解决方法

原因: 在fragment中来回切换时RecyclerView获得了焦点,而RecyclerView的 focusableOnTouchMode属性默认是true,所以在切换时RecyclerView自动获得焦点就滚动到了底部. 解决办法: 将RecyclerView上面的控件的设置android:focusableInTouchMode="true"(若无上方控件建议加一个不影响布局的View),如: 1 <?xml version="1.0" encodi

DOS中多命令来回切换的技巧

看毕向东老师的视频,发现老师在DOS窗口敲一个键就可以瞬间打出java Demo,然后又敲了一个键前面那句话瞬间变成javac Demo.java;由于是视频教程,看不到老师具体是是用什么技巧可以在多种命令语句之间来回切换.起初我猜想是不是指定了什么快捷键代替这些语句,但是后来想如果这样的话,语句之间是不可能实现切换的,况且DOS似乎没有这样的命令,于是纠结了很久,上网查资料也是毫无收获,幸运的是毕向东老师在下一节课中,出现了一点小失误,为了解释这个失误变透漏了所使用的技巧: 在DOS窗口按上下

底部菜单中用fragment,fragment中套用PagerSlidingTabStrip,切换底部时viewpager消失

今天在开发时遇上一个问题,我用的框架是底部菜单四个按钮+fragment,然后主页中的fragment套用了PagerSlidingTabStrip,PagerSlidingTabStrip中是用Viewpager+Tab组合进行点击切换页面或者滑动切换菜单,就这样实现了我想要的功能,可是当我在底部菜单中相互切换时,PagerSlidingTabStrip中的Viewpeger消失了,这是怎么产生的呢?官方的Demo没有组合起来使用,所以没有问题,现在组合后问题就出来了,我换用了几个方法都没有解

在Fragment中嵌套使用viewpagerindicator切换Fragment返回后出现空白页与FragmentPagerAdapter页面预加载的解决方案

1. 在Fragment中嵌套使用viewpagerindicator切换Fragment返回后出现空白页 先上代码: 1 mAdapter = new OrderAdapter(getChildFragmentManager()); 2 ViewPager pager = (ViewPager) v.findViewById(R.id.pager); 3 pager.setAdapter(mAdapter); 4 5 TabPageIndicator indicator = (TabPageI

fragment中嵌套viewpager,vierpager中有多个fragment,不显示 .

fragment中嵌套viewpager,vierpager中有多个fragment,不显示 ... 现在好多应用流行一种布局.底部几个工具栏选项,上面也有类似tab的选项. 底部用RadioGroup控制fragment的切换.以上有五个fragment. 第一个fragment,代表着首页.首页又是一个类似tab的fragment,使用viewpager切换着两个fragment. private void InitViewPager(View parentView) {        mP

Android使用Fragment打造万能页面切换框架

首先我们来回忆一下传统用Activity进行的页面切换,activity之间切换,首先需要新建intent对象,给该对象设置一些必须的参数,然后调用startActivity方法进行页面跳转.如果需要activity返回结果,则调用startActivityForResult方法,在onActivityResult方法中获得返回结果.此外,每一个要展示的activity需要在AndroidManifest.xml文件中注册.而且,如果在某些特定的情况下(比如65536方法数爆炸)要动态加载dex

Activity嵌套多个Fragment实现横竖屏切换

一.上图 二.需求 近期项目遇到个横竖屏切换的问题,较为复杂,在此记之. 1.Activity中竖屏嵌套3个Fragment,本文简称竖屏FP1,FP2,FP3. 2.其中竖屏FP1与FP2可以切换为横屏的FL1,FL2,即竖屏FP1切换到对应的横屏FL1,竖屏FP2对应切换到横屏FL2. 3.FP3不允许横竖屏切换. 4.竖屏FP1,FP2,FP3用ViewPager实现左右滑动切换. 5.横屏的FL1,FL2用布局中的切换按扭实现左右切换,不允许滑动切换. 看到这需求有点儿晕菜了吧!!!呵呵