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

Advertisement

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

"Duplicate id 0x7f05000a, tag null, or parent id 0x7f050009 with
another fragment for com........ fragmentname"

这意味着已经添加过fragment,有谁可以帮我完成fragment的相关设定,并顺利的完成来回切换?
如下是,MainActiviy的代码,它可以控制动态添加/替换fragment:

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

<?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>

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

原问题:Fragment Inside Fragment

--cut--

辰海在2014-01-23 20:13:10回答到:

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



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

@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。你可以禁用一些不必要的程序,具体方法如下:

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;
}

Similar Posts:

  • fragment中百度地图切换黑屏以及与surfaceview的切换

    fragment中添加地图进行切换时会出现黑屏闪烁现象,其主要原因在于百度地图本身释放时导致的,那么对应的解决方案就是不释放百度地图对应的fragment. <FrameLayout         android:layout_width="match_parent"         android:layout_height="0dp"         android:layout_weight="1" >         <

  • Fragment详解之六——如何监听fragment中的回退事件与怎样保存fragment状态

    前言:计划总是赶不上变化,无论结局怎样,只要一直跟随自己的内心,不放弃,总有一天,你会成为那个人,加油. 相关文章: 1.<Fragment详解之一--概述> 2.<Fragment详解之二--基本使用方法> 3.<Fragment详解之三--管理Fragment(1)> 4.<Fragment详解之四--管理Fragment(2)> 5.<Fragment详解之五--Fragment间参数传递> 6.<Fragment详解之六--如何监听

  • Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理

    Toolbar作为ActionBar使用介绍 本文介绍了在Android中将Toolbar作为ActionBar使用的方法. 并且介绍了在Fragment和嵌套Fragment中使用Toolbar作为ActionBar使用时需要注意的事项. 使用support library的Toolbar Android的ActionBar每个版本都会做一些改变, 所以原生的ActionBar在不同的系统上看起来可能会不一样. 使用support library版本的Toolbar可以让你的应用在多种设备类型

  • [FAQ06937]不开机、反覆掉电且log中仅来回出现"Jump to BL"语句问题

    [FAQ06937]不开机.反覆掉电且log中仅来回出现"Jump to BL"语句问题 2014-09-25 平台MT6572MT6589MT6592MT6595MT6571MT6582MT6582/92+MT6290MT6588MT6732/52 软件分支JB2JB3KK1KK1.MP1... FAQs 38 of 110 如何设置吐uart log的uart口 如何处理工厂模式(factory mode)崩溃的问题? 内容 [DESCRIPTION] 不开机.反覆掉电且log中仅

  • Android EventBus在Fragment中不起作用的解决方法

    一.AndroidEventBus. android平台事件总线框架.介绍:https://github.com/bboyfeiyu/AndroidEventBus/blob/master/README-ch.md 二.问题出现情形. AndroidEventBus在Fragment中注册,由其他地方向Fragment中post事件. 三.问题出现原因. 由其他地方向Fragment post事件的时候,Fragment还未初始化,也即AndroidEventBus在此Fragment中还未注册

  • Qt多窗口来回切换实战

    学习Qt有一段时间了,今天算是空闲,总结一下之前过的多窗口切换的实现过程.因为自己在学这个的时候在网上查找过一些资料,感觉都没有完全把过程讲清楚,对于初学者来说是一种痛苦(老是缺这缺那得,估计都是大神给的,哈哈!).今贴出自己之前完成过的一个多窗口切换的实例,希望能给初学Qt的同学们一些启发,少走一些弯路.共勉! 实例实现的功能:实现多个窗口之间的切换.一个主窗口(Widget)两个对话框(Dialog),Dialog1和Dialog2.当点击主窗口的按键时,主窗口自动影藏,同时弹出Dialog

  • Fragment中获取Activity的Context

    Fragment中获取Activity的Context时只需要this.getActivity()即可.

  • Android在Fragment中使用Tab

    Tab使用非常常见,实现方式也很多,这里分享一种使用ViewPagerIndicator快速实现tab的方法,并且可以根据需要实现不同的效果,包括文字title.文字title+图标.小点指示灯,并可以实现滑动自动切换标签效果. 来张效果截图: 添加tab步骤如下: 1.添加使用ViewPagerIndicator库(AS中直接导入library) 2.Fragment布局文件fragment.xml中添加 <com.viewpagerindicator.TabPageIndicator and

  • uC/OS-ii在M3中的任务切换与任务堆栈

    1 uc/os ii在M3中的堆栈结构 1.1 M3入账序列 1.2 加上手工入栈序列 2 PendSV在Cortex-M3中的应用 Systick为嵌入到内核中,优先级比一般中断优先级高.若在一般中断的ISR执行过程中,发生了Systick异常,则Systick会抢占该ISR.若此时Systick做上下文切换,在M3中将触发用法fault(在中断活跃时尝试切入线程模式).即使在别的内核体系下不发生硬fault,ISR也会被延迟,这对于任一讲究实时性的系统是不能接受的. 所以Systick只是在

  • 如何在fragment中获取自定义view的控件id

    今天在CSDN上下载了一个关于广告轮播的demo,上面的控件是自定义view的控件.当我把它放到项目中犯了难,因为他直接在activity中定义, 而我需要将其放入fragment中,所以报了一堆错误还有空指针,主要的问题及解决可见代码,需要注意的问题是,不能直接在oncreate方法中直 接初始化控件,而是需要重写onStart()方法: public void onStart() { super.onStart(); initData(); // makeInitData(); // rea