具有片段添加的条件

时间:2015-01-22 00:57:22

标签: android android-fragments fragment conditional-statements

过去4个小时我一直试图了解如何做到这一点。 要清楚,我需要在一定条件下添加一个片段,为了我的目的,条件可以是: 一个。如果父母的id与我所寻求的匹配。 湾如果片段的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"/>

感谢您的帮助,任何一种方式都可以帮助我。

2 个答案:

答案 0 :(得分:0)

我之前做过类似的事情,我必须根据PickHeaderFragmentFragment显示在root_frame_body内的值来决定,这是我如何实现的:

我的父母或主人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将在onAttachPickHeaderFragment内)添加它来实现此界面,如下所示:

@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");
    }
}

现在,当我点击Button内的PickHeaderFragment时,我会调用此事件让我的主持人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();;
    }
}

我现在能够在孩子Fragment内发生事件后更改主机Fragment中的布局(或Fragment显示的内容)。

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

总之,我建议您按照类似的方式设置主持人ActivityFragment,并确保在视图中添加了FrameLayout,以便让您充气Fragment 1}}你需要。

这样做的另一个好处是,您可以将代码分隔为单独的Fragments

答案 1 :(得分:0)

Leigh感谢您的回答,但我不知道您是否理解我的问题,或者我不明白您的答案......

无论如何,我通过以编程方式在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
    }

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