什么是使用碎片的正确方法?

时间:2014-09-23 14:13:14

标签: android android-fragments

使用片段的正确方法是什么?我应该每个接口只使用一个FragmentActivity还是对所有接口使用独特的FragmentActivity?

我的应用非常简单:它有4个不同的界面,顶部有一个固定的选项菜单,我只在一个名为'actions'的界面中显示上下文菜单。

我想只使用一个FragmentActivity,我可以在片段之间切换。这是一个好习惯还是我应该为每个接口保留一个FragmentActivity?

到目前为止,我每个界面都使用一个FragmentActivity,但是当我更改(启动)FragmentActivity时,看起来这就是创建一个新对象,我的应用程序在打开新活动之前会闪烁。

提前感谢。

编辑:

以下是我的应用的图片:http://postimg.org/image/mvxyk2527/

3 个答案:

答案 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.class(扩展FragmentActivity)
  • Interface1Fragment.class(extends Fragment)
  • Interface2Fragment.class(extends Fragment)
  • Interface3Fragment.class(extends Fragment)
  • Interface4Fragment.class(extends Fragment)

布局:

  • act_main.xml,frg_inter1,frg_inter2,frg_inter3和frg_inter4。

在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)