我有一个有两个按钮的SchoolActivity: -Primary(添加PrimaryFragment) -Secondary(添加SecondaryFragment)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.yuv.mycollege.MainActivity">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/button_primary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Primary"/>
<Button
android:id="@+id/button_secondary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Secondary"/>
</LinearLayout>
<!-- Main content area for fragments-->
<FrameLayout
android:background="@color/colorPrimary"
android:id="@+id/main_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:padding="4dp"/>
</LinearLayout>
这两个片段都有内容和页脚区域,它们本身就是片段(PrimaryContentFragment,PrimaryFooterFragment,SecondaryContentFragment,SecondaryFooterFragment)
我使用以下方法添加活动中的片段:
public void onClick(View view) {
Button button = (Button)view;
Toast.makeText(this, "Going to Add Children", Toast.LENGTH_SHORT).show();
switch(view.getId()) {
case R.id.button_primary:
getSupportFragmentManager().beginTransaction()
.replace(R.id.main_container, new PrimaryFragment())
.addToBackStack("primary")
.commit();
break;
case R.id.button_secondary:
getSupportFragmentManager().beginTransaction()
.replace(R.id.main_container, new SecondaryFragment())
.addToBackStack("secondary")
.commit();
break;
}
}
最后,使用以下方法添加每个子片段: 布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/content_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/colorAccent"
android:layout_weight="8"
></FrameLayout>
<FrameLayout
android:id="@+id/footer_container"
android:background="@color/colorPrimaryDark"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
></FrameLayout>
</LinearLayout>
儿童片段添加:
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.primary_fragment, container, false);
getChildFragmentManager()
.beginTransaction()
.add(R.id.content_container, new PrimaryContentFragment())
.add(R.id.footer_container, new PrimaryFooterFragment())
.addToBackStack("primarychildren")
.commit();
return view;
}
我正在为另一个片段添加类似的逻辑,依此类推其余的工作。
问题: 如上所述的解决方案是有效的,但似乎是非常原始的天真方法。任何人都可以提出我可以遵循的更好的架构,例如:
成为一个新的安卓设备,我唯一关心的是我做正确的方式!!!
答案 0 :(得分:0)
使用bundle
:
ContentFragment content=new ContentFragment();
content.setArguments( ( new Bundle()).putString("value","primary"));
getChildFragmentManager()
.beginTransaction()
.add(R.id.content_container, content)
.add(R.id.footer_container, new PrimaryFooterFragment())
.addToBackStack("primarychildren")
.commit();
同样适合二次使用: -
ContentFragment content=new ContentFragment();
content.setArguments( ( new Bundle()).putString("value","secondary"));
使用相同的
设置文字content
和footer
片段,只需使用bundle arguments
答案 1 :(得分:0)
所有片段(Primary / Secondary / ...)都使用相同的设计 我创建了一些基类来继承常用功能
如果他们使用相同的设计并且内容稍有变化,那么就不需要创建不同的Fragment
类。您只需从调用Activity
或Fragment
传递必要的值即可填充每个子片段中的内容。
所有片段的所有页脚都相似但文本简单 改变(可能像breadcrumb)所以,我可以使用相同的页脚 使用某种settext方法的片段......
如果它们只是简单的文字更改,那么请使用setArguments
和getArguments
方法在Fragment
之间传递值,而不是创建不同的Fragment
类。
以下是pass values between fragments的方法。这就是你can pass data from your Activity
to Fragment
的方式。
如何在活动和片段之间进行有效沟通
请按照上面的两个链接在Activity
和Fragment
之间进行通信。
<强>更新强>
跟进评论,正如您所说PrimaryFragment
和SecondaryFragment
很可能,我建议你让一个Fragment
拥有所有这些。您可以考虑使用具有页脚PrimaryFragment
的单个SecondaryFragment
,而不是CommonFragment
,Fragment
和Fragment
。当您要启动该Fragment
的实例时,只需传递必要的值以将数据填充为Fragment
的内容。
如果我没有说清楚,请告诉我。