有条件分片添加
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
。
总而言之,我建议您遵循类似的模式,即拥有主机 Activity
或 Fragment
并确保将 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 布局中执行任何更改。
在过去的 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
。
总而言之,我建议您遵循类似的模式,即拥有主机 Activity
或 Fragment
并确保将 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 布局中执行任何更改。