使用片段的正确方法是什么?我应该每个接口只使用一个FragmentActivity还是对所有接口使用独特的FragmentActivity?
我的应用非常简单:它有4个不同的界面,顶部有一个固定的选项菜单,我只在一个名为'actions'的界面中显示上下文菜单。
我想只使用一个FragmentActivity,我可以在片段之间切换。这是一个好习惯还是我应该为每个接口保留一个FragmentActivity?
到目前为止,我每个界面都使用一个FragmentActivity,但是当我更改(启动)FragmentActivity时,看起来这就是创建一个新对象,我的应用程序在打开新活动之前会闪烁。
提前感谢。
编辑:
以下是我的应用的图片:http://postimg.org/image/mvxyk2527/
答案 0 :(得分:5)
这真的是很多个人偏好和要求。我并不是“正确的方式”的忠实信徒。概念,如果你实现了目标,那么它没有错,但可能有更好的方法。
对我来说,这将取决于每个FragmentActivity处理多少嵌套片段。如果你有一个嵌套片段树,你可能会陷入混乱的嵌套片段堆栈等。
http://developer.android.com/training/implementing-navigation/temporal.html
就个人而言,如果我正在编写一个包含大量片段的应用程序,我倾向于使用单个Activity,这使得单个Fragment堆栈的导航更易于管理,因为使用多个FragmentActivity实例将使用多个片段堆栈。
http://developer.android.com/training/implementing-navigation/index.html
如果您想使用表格和滑动导航,可以考虑使用ViewPager方法。虽然如果你有很重的可滚动内容视图,我会犹豫,因为对于某些人来说,多向手势界面可能会非常令人沮丧。
http://developer.android.com/training/implementing-navigation/lateral.html
如果您的代码干净,易于管理而且没有泄漏参考,那么我可能会坚持使用您所拥有的内容,并且不会浪费您的时间来重新分解它。
答案 1 :(得分:2)
我会尽力解释一下。在您的情况下,您必须使用一个包含片段的FragmentActivity。您必须为每个接口创建一个片段,并在用户单击菜单时提交(交换)。这可能是项目结构的一个例子:
Java类:
布局:
在MainActivity和act_main.xml中,您必须为菜单创建tabhost或navigationDrawer,并实现允许在片段之间切换的方法。稍后,在每个片段中,您必须实现接口功能。
一些代码:
MainActivity:
public class ActMain extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_main);
}
private void createMenu() {
//you can create a menu with tabhost or navigation drawer
}
// replace a fragment
public void replaceFragment(Fragment launchFragment) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(android.R.id.tabcontent, launchFragment).commit();
}
}
片段:
public class Interface1Fragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.frg_inicio, container, false);
return rootView;
}
}
MainActivity.xml
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:facebook="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- Main content -->
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0" />
<!-- Left Navigation Drawer -->
<LinearLayout
android:id="@+id/left_drawer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@color/black_actionbar"
android:choiceMode="singleChoice"
android:onClick="emptyOnClick"
android:orientation="vertical" >
/LinearLayout>
</android.support.v4.widget.DrawerLayout>
在片段xml文件中,您必须设计接口。
答案 2 :(得分:1)
是的,您应该只更改片段,而不是重新启动片段活动,如果该部分保持不变并且工作相同。 你应该在这样的片段之间切换:
getFragmentManager().beginTransaction().replace(R.id.container, new MyFragment()).addToBackStack(null).commit();
或者像这样,如果你支持API&lt; 14
getSupportFragmentManager().beginTransaction().replace(R.id.container, new MyFragment()).addToBackStack(null).commit();
注意:如果你不想回到之前加载的片段onBackPressed,请删除addToBackStack(null)