48

好的,每当我尝试替换应用程序中的片段时,它只会将片段添加到另一个片段所在的容器内,并留下当前片段。我尝试调用替换并引用包含片段的视图,并通过引用片段本身。这些都不起作用。我可以使用片段事务管理器将片段添加到视图中,但即使我在添加后尝试将其删除,它也不起作用。任何帮助,将不胜感激。这是我的文件。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //Setup the actionabar. Use setDrawableBackground to set a background image for the actionbar.
    final ActionBar actionbar = getActionBar();
    actionbar.setDisplayShowTitleEnabled(false);
    actionbar.setDisplayUseLogoEnabled(true);
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionbar.addTab(actionbar.newTab().setText(R.string.home_tab_text).setTabListener(this),true);
    actionbar.addTab(actionbar.newTab().setText(R.string.insert_tab_text).setTabListener(this));

    Fragment fragment = new insert_button_frag();
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.button_fragment, fragment);
    transaction.addToBackStack(null);

    transaction.commit();
}

这是布局

<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:orientation="vertical"
        android:id="@+id/button_fragment_container"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <fragment
            android:name="com.bv.silveredittab.home_button_frag"
            android:id="@+id/button_fragment"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <fragment
            android:name="com.bv.silveredittab.quick_insert_frag"
            android:id="@+id/quick_insert_frag"
            android:layout_width="350dip"
            android:layout_height="fill_parent" />

        <fragment
            android:name="com.bv.silveredittab.editor_frag"
            android:id="@+id/editor_frag"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

    </LinearLayout>

</LinearLayout>

这是片段代码

public class insert_button_frag extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        return inflater.inflate(R.layout.insert_buttons,container, false);
    }
}

就像我说的那样。我已经尝试引用片段父视图来替换它,片段本身(通过 id),它仍然只添加新片段,在原始片段所在的包含视图中。

4

4 回答 4

37

我通过在布局中使用占位符然后在运行时将我的片段附加到它来解决这个问题。

像你一样,如果我在我的 xml 布局中实例化我的 Fragment,那么在运行时将其替换为另一个 Fragment 后内容将保持可见。

于 2011-03-17T22:16:45.640 回答
20

问题是这一行:

transaction.replace(R.id.button_fragment, fragment);

replace有两种重载形式。在它们中,第一个参数是要替换的 Fragment的容器,而不是 Fragment 本身。所以,在你的情况下,你需要打电话

transaction.replace(R.id.button_fragment_container, fragment);

编辑:我在你的问题中看到你已经尝试过这两种方法。我已经测试并验证了这种行为。这似乎是 FragmentTransaction API 中的一个错误。

Edit2:毕竟不是错误。您根本无法替换在布局文件中静态添加的片段。您只能替换您以编程方式添加的那些(Android:不能用另一个片段替换一个片段

于 2012-03-16T05:08:01.420 回答
2

我遇到过同样的问题。看看这个链接:Android Fragment Duplication

我想知道您将容器传递到 inflater.inflate() 方法这一事实是否会导致它在旧片段中创建新片段而不是批量替换。我一直在工作版本中为我的充气机提供“null”。

这是我正在使用的版本中的要点...

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
   View newFrag = new View(getActivity().getApplicationContext());
   newFrag = inflater.inflate(R.id.frag, null);
   return newFrag;
}
于 2011-03-14T01:37:30.573 回答
0

歌开发者指南非常令人困惑,因为它首先显示在你的 xml 中实现硬编码片段。但是如果你真的想用新的片段替换现有的片段,那么你应该在运行时添加它(第一个)。

官方网站状态是什么

FragmentTransaction 替换(int containerViewId、Fragment 片段、String 标签)

替换已添加到容器中的现有片段。这与为所有当前添加的片段调用 remove(Fragment) 基本相同,这些片段使用相同的 containerViewId 添加,然后使用此处给出的相同参数调用 add(int, Fragment, String)。

您应该注意到它说Replace an existing fragment that was added to container

所以,你的 xml 应该看起来像 someActivity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    tools:context="someActivity">

    <ImageView
        .../>

    <LinearLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="bottom"/>

</RelativeLayout>

而不是在你的活动中做OnCreate()

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        [...]
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container, new FirstFragment).commit();

    }

比您可以轻松地用动画替换片段并将其添加到后堆栈以保存其状态。

private SecondFrag getSecondFrag(){
    if(secondFrag == null)
        secondFrag = new SecondFrag()
    return secondFrag;
}

private void openRechargeFragment(){
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setCustomAnimations(R.anim.show_frag, R.anim.hide_frag,
                R.anim.show_frag, R.anim.hide_frag);
        ft.replace(R.id.fragment_container, getSecondFrag(), "myTAG");
        ft.addToBackStack(null);
        ft.commit();
}
于 2016-07-20T09:32:52.143 回答