如何使用FragmentManager和FragmentTransaction来替换单个fragment?

6
我有一个包含3个片段的活动;一个头部;一个主体;一个页脚(与HTML中相同)。主体片段包含三个按钮,每个按钮都应该用另一个片段替换中间片段(主体本身),但我无法弄清楚如何在此处使用FragmentManager和FragmentTransition。我似乎找不到其他人在这里关于他们如何实现片段的方式的连贯性。似乎每个人都有自己的方法,或者只是没有在他们的线程中包含完整的代码。
MainActivity.java
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.test_frag);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

TestFragment.java

public class TestFragment extends Fragment {

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

    return inflater.inflate(R.layout.test_frag, container, false);
}

}

BodyFragment.java

public class BodyFragment extends Fragment {

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

    return inflater.inflate(R.layout.body_frag, container, false);
}

}

XML中的片段

<fragment
    android:id="@+id/bodyfragment"
    android:name="com.example.test.BodyFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    tools:layout="@layout/body_frag" />

在XML中进行BodyFragment布局(包含三个按钮)

    <Button
    android:id="@+id/bsettings"
    android:layout_width="130dp"
    android:layout_height="40dp"
    android:layout_alignBaseline="@+id/bgames"
    android:layout_alignBottom="@+id/bgames"
    android:layout_toRightOf="@+id/bgames"
    android:text="SETTINGS" />

1
官方文档中有一个相当简单的实现示例,为什么对你不起作用?http://developer.android.com/guide/components/fragments.html - 2Dee
@2Dee 那正是我正在遵循的教程。里面的片段示例与他们如何教授你如何使用FragmentManager和FragmentTransactions有所不同。我不知道我应该从Activity还是BodyFragment调用FragmentManager。我也不知道我应该在仅限于bodyfragment还是整个activity上调用事务。文档很难阅读。 - Carl
你应该将那段代码放在Activity中,例如在onCreate方法中。在transaction.replace(R.id.fragment_container, newFragment)中,fragment_container是你的Activity布局中用于容纳Fragment的容器的id,newFragment是你想要放入容器中的Fragment。 - 2Dee
1个回答

11

您可以像这样使用FragmentManager:

FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.bodyfragment, AnotherFragment.newInstance()); // newInstance() is a static factory method.
transaction.commit();

这段代码将用另一个片段的新实例替换位于ID为R.id.bodyfragment的视图中的片段。

编辑:

为了创建另一个片段的新实例,应该使用静态工厂方法。你可以在你的片段中像这样实现它们:

public class AnotherFragment extends Fragment {

    public static AnotherFragment newInstance() {
        AnotherFragment fragment = new AnotherFragment();
        ...
        // do some initial setup if needed, for example Listener etc
        ...
        return fragment;
    }
    ...
}

我应该把这个放在BodyFragment.java的onCreateView里面吗?如果是的话,它会要求我在AnotherFragment.java中创建newInstance()方法,这样会导致FragmentManager无法访问。通过谷歌搜索结果可以看到更多有关newInstance()用法的讨论,而不是使用示例。 - Carl
你可以将这个代码段放在按钮的onClickListener中,或者任何你想要改变片段的地方。创建新的Fragment实例应该使用静态工厂方法,这就是我例子中的newInstance()方法。我会编辑我的答案以便澄清。 - Xaver Kapeller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接