• 如何进行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

  • 相关阅读:
    数据库反范式~认识三大范式
    王家林的“云计算分布式大数据Hadoop实战高手之路从零开始”的第五讲Hadoop图文训练课程:解决典型Hadoop分布式集群环境搭建问题
    linux网络编程之System V 信号量(三):基于生产者消费者模型实现先进先出的共享内存段
    html知识点总结
    [置顶] HTML5开源RPG游戏引擎lufylegendRPG 1.0.0发布
    通过Android trace文件分析死锁ANR
    黄金连分数 蓝桥杯
    vxworks 6.9.3.1
    poj 3468 A Simple Problem with Integers(线段树区区)
    关于Java序列化的一些高级用法
  • 原文地址:https://www.cnblogs.com/daishuguang/p/3888627.html
Copyright © 2020-2023  润新知