有条件分片添加

having a condition to fragment adding

在过去的 4 个小时里,我一直在努力了解如何去做。 需要明确的是,我需要在特定条件下添加一个片段,为了我的目的,条件可以是: 一种。如果 parent 的 ID 与我寻找的相匹配。 b.如果片段的 id 与我寻找的相匹配。

我试图将条件放在片段本身中:

public class BlockFrag extends Fragment{
SharedPreferences sp;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    sp =  getActivity().getSharedPreferences("myOptions", Context.MODE_PRIVATE);
    int id = container.getId();//didn't work(i think the container is null for some reason
    switch (id)
    {
        default: return inflater.inflate(R.layout.nothing, container, false);

        case (R.id.redFrame): {
            if (sp.getBoolean("redBlock", true)) {
                return inflater.inflate(R.layout.block_frag, container, false);
            }
        }
        case (R.id.greenFrame): {
            if (sp.getBoolean("greenBlock", true)) {
                return inflater.inflate(R.layout.block_frag, container, false);

        }

我也尝试以编程方式获取条件,但我无法理解如何防止片段在我调用其放置的布局时自动生成。

这是它放置示例的布局

<FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/redFrame"
        android:layout_weight="0.33333">


        <fragment
            android:name="com.example.dor.myapplication.BlockFrag"
            android:id="@+id/blockRed"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:layout="@layout/block_frag"/>

如果重要的话,这是片段的布局...

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">

<ImageView
    android:layout_width="118dp"
    android:layout_height="match_parent"
    android:id="@+id/blockFrag"
    android:src="@drawable/block"
    android:layout_weight="0.33333"
    android:layout_above="@+id/linearLayout"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_gravity="left"
    android:scaleType="fitXY"/>

谢谢你的帮助,任何一种方法都会帮助我。

我之前做过类似的事情,我必须根据 PickHeaderFragment 的值来决定将哪个 Fragment 显示在我的 root_frame_body 中,这是我如何实现的:

我的 Parent 或主机 Fragment:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:background="#000"
        android:layout_height="wrap_content"
        android:id="@+id/root_frame_header" />

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:background="#000"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:id="@+id/root_frame_body" />

</LinearLayout>

在我的主机内部 Fragment:

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

    super.onCreate(savedInstanceState);

    View rootView = inflater.inflate(R.layout.fragment_pick, container, false);
    headerFragment = PickHeaderFragment.newInstance("");
    getChildFragmentManager().beginTransaction().replace(R.id.root_frame_header, headerFragment).commit();
}

我的 PickHeaderFragment 实现了一个 OnPickHeaderFragmentInteractionListener 接口,如下所示:

public interface OnPickHeaderFragmentInteractionListener {
    public void onFragmentInteraction(int res);
}

我确保我的主机 Fragment 将通过在 onAttach 期间(在 PickHeaderFragment 内)添加它来实现此接口,如下所示:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    try {
        Fragment f = getParentFragment();
        mListener = (OnPickHeaderFragmentInteractionListener) getParentFragment();
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString() + " must implement OnFragmentInteractionListener");
    }
}

现在,当我的 PickHeaderFragment 中的输入 Button 被点击时,我调用此事件让我的主机 Fragment 知道更改 root_frame_body:

在我的主机中 Fragment 我有:

@Override
public void onFragmentInteraction(int res) {
    if (res == R.id.btnEnter) {
        getChildFragmentManager().beginTransaction().replace(R.id.root_frame_body, new PickByItemBodyFragment()).commit();;
    }
}

我现在可以在 child Fragment 中发生事件后更改主机 Fragment 中的布局(或显示哪个 Fragment)。 =41=]

注意:在我的示例中,我嵌套了 Fragments,但您可以在 Activity 中轻松地嵌套多个 Fragments

总而言之,我建议您遵循类似的模式,即拥有主机 ActivityFragment 并确保将 FrameLayout 添加到您的视图中以允许您膨胀任何内容Fragment你需要。

这样做的另一个好处是您还可以将代码隔离到单独的 Fragments 中。

Leigh 谢谢你的回答,但我不知道你是没看懂我的问题还是我没看懂你的回答...

无论如何,我通过在 activity 的 r=onCreate 中以编程方式添加片段并将添加插入到 "if"

中解决了我的问题
    BlockFrag rb = new BlockFrag();
    FragmentManager fragmentManager = getFragmentManager ();//declaring Fragment Manager
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction ();// declaring Fragment Transaction

    if(condition)
    {
        editor.putBoolean("redBlock", true);
        fragmentTransaction.add(R.id.redFrame, rb);//adding the fragment
    }

不用说,我没有在 activity 布局中声明片段,也没有在片段 class 或片段 xml 布局中执行任何更改。