代码之家  ›  专栏  ›  技术社区  ›  akhalsa

Android碎片替换没有任何作用

  •  3
  • akhalsa  · 技术社区  · 12 年前

    我希望有人能澄清我在这里做错了什么。我在平板电脑上有一个通用的主细节,采用横向模式。唯一需要注意的是,master中的一些元素在Detail部分打开FragA,而其他元素在Detail部分打开FragB。除了切换碎片的实际过程外,一切似乎都很好。无论哪个片段最先显示,都是唯一显示的片段。我一直在使用replace方法来交换它们,我能找到的关于这个主题的所有SO评论都指出,如果我在XML中添加了细节片段,这将不起作用。不幸的是,这并不适用于我,因为我是动态添加所有片段的。我的代码如下所示:

    FragmentInfo frag = (Helper.isImageViewable(fileSelected)) ?  getFragInfoByClass(ImageViewerFragment.class) : getFragInfoByClass(DownloadProgressFragment.class) ;
             FragmentTransaction ft = getFragmentManager().beginTransaction();
             if(frag.mFragment == null){
                 frag.mFragment = Fragment.instantiate(NewMainActivity.this, frag.mClass.getName());
                 ft.add(frag.target.getId(), frag.mFragment);
                 ft.commit();
                 ft = getFragmentManager().beginTransaction();
             } 
             ft.replace(frag.target.getId(), frag.mFragment);
             ft.commit();
    

    这是在任何地方用于添加这些片段的唯一代码,似乎发生的是,首先添加的片段都可以正常工作,但replace方法根本不起作用。无论是哪一块碎片。。。仍然存在。

    有人知道我做错了什么吗?

    编辑

    布局文件的相关部分如下所示:

        <LinearLayout
        android:id="@+id/fragments_holder"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
    
        <FrameLayout
            android:id="@+id/list_fragment"
            android:layout_width="0dp"
            android:layout_weight="0.39"
            android:layout_height="match_parent" />
    
        <FrameLayout
            android:id="@+id/details_fragment"
            android:layout_height="match_parent"
            android:layout_weight="0.61"
            android:layout_width="0dp" />
    
        <!-- ADD METADATA VIEW HERE -->
    
    </LinearLayout>
    

    两个FragmentInfo对象都正确地具有一个具有id/details_fragment的FrameLayout目标,这一事实证明,如果其中一个是第一个添加的,那么它可以正常工作。

    编辑2 注意:使用此代码块也会得到完全相同的结果:

    FragmentInfo frag = (Helper.isImageViewable(fileSelected)) ?  getFragInfoByClass(ImageViewerFragment.class) : getFragInfoByClass(DownloadProgressFragment.class) ;
             FragmentTransaction ft = getFragmentManager().beginTransaction();
             if(frag.mFragment == null){
                 frag.mFragment = Fragment.instantiate(NewMainActivity.this, frag.mClass.getName());
                 ft.add(frag.target.getId(), frag.mFragment);
                 //ft.commit();
                 //ft = getFragmentManager().beginTransaction();
             } else{
                 ft.replace(frag.target.getId(), frag.mFragment);
             }
             //ft.replace(frag.target.getId(), frag.mFragment);
             ft.commit();
             detailsContainer.setFragmentInfo(frag);
    
    1 回复  |  直到 12 年前
        1
  •  1
  •   antonyt    12 年前

    替换实际上与一系列删除和添加操作相同。即使容器是空的,替换仍然可以安全使用(这与简单的添加相同)。我更喜欢使用显式的删除和添加操作,因为这样更容易推理。

    我认为您的代码示例一开始有一些问题,但初始化完成后似乎有一些正确的路径。在第一个代码示例中,使用相同的片段实例调用add和replace(在尚未创建片段的情况下)。在第二个代码示例中,您不删除旧片段(在要添加的第二个片段尚未创建的情况下)。

    我认为,如果您注释掉(删除)双重添加,您的第一个代码示例将正确执行替换操作:

    FragmentInfo frag = (Helper.isImageViewable(fileSelected)) ?  getFragInfoByClass(ImageViewerFragment.class) : getFragInfoByClass(DownloadProgressFragment.class) ;
             FragmentTransaction ft = getFragmentManager().beginTransaction();
             if(frag.mFragment == null){
                 frag.mFragment = Fragment.instantiate(NewMainActivity.this, frag.mClass.getName());
                 // ft.add(frag.target.getId(), frag.mFragment);
                 // ft.commit();
                 // ft = getFragmentManager().beginTransaction();
             } 
             ft.replace(frag.target.getId(), frag.mFragment);
             ft.commit();