如何使用可重用的活动在我的应用程序中定义不同的活动流?

Posted

技术标签:

【中文标题】如何使用可重用的活动在我的应用程序中定义不同的活动流?【英文标题】:How can I define different activities flows in my app using reusable activities? 【发布时间】:2016-08-16 06:33:35 【问题描述】:

所以,希望这个问题没有被模糊地描述,我的情况如下:

在我的应用程序中,我有三个流程(显然将来可能会更多,但我必须尽快交付这个应用程序以满足要求,并且像往常一样尽我最大的努力为我旁边的人打下坚实的基础) 因此,在这三个流程中,每个流程有四个步骤,每个步骤都相当简单,只需获取一条数据并将其传递到流程结束。

所以,我的问题是:就易于实施和可扩展性而言,这将是“最佳”方法,以便能够定义那些重用某些活动的流程。换句话说,我有类似的东西:

流程 1:

A 到 B 到 C 到 D 显示所有收集的数据

流程 2:

A 到 E 到 C 到 D 显示所有收集的数据

流程 3:

A 到 F 到 G 到 D 显示所有收集的数据

应该如何处理数据以及我如何对每个活动说下一个活动,除了我正在使用一个带有后退箭头的操作栏,所以无论如何你都可以去返回上一步并编辑您之前选择或创建的数据。

也许“最好”这个词不太合适,因为我不是在寻求简单的意见,而是在寻求在 android 应用程序中执行此操作的建议方法,因为我会说很多应用程序都是这种情况不得不处理。

更新一:

实现这个流程的第一轮我采用了以下方法,(简而言之,一种损坏的伪 java 代码)

// ActionBarActivity suppose to offer me the change to deal with actionBar and fragment otherwise just Fragment
Flow1Activity extends ActionBarActivity implements AFragmentListener
    onCreate 
        newFragment = new FragmentA();
        generateTransactionTo(newFragment);
    
    generateTransactionTo(android.app.Fragment newFragment) 
        FragmentTransaction transaction = getFragmentManager().beginTransaction();

        transaction.replace(R.id.container, newFragment);
        transaction.addToBackStack(null);

        transaction.commit();
    
    onAfragmentConfirmed() 
        // do whatever...
    

之后,每个片段都有自己的内部接口,活动持有者应该实现(也许在片段的每个下一个您将调用此注入接口),例如:

FragmentA extends Fragment
    public interface AFragmentListener 
        void onAFragmentConfirmed();
    
    onAttach(Context context) 
        super.onAttach(context);
        Activity activity = getActivity();

        try 
            mAFragmentListener = (AFragmentListener) activity;
         catch (ClassCastException e) 
            throw new ClassCastException(activity.toString() + " must implement AFragmentListener");
        
    
    onClickSomething() 
        mAFragmentListener.onAfragmentConfirmed()
    

我当前的问题是 ActionBar 没有按预期工作,我正在设置我的操作栏:

ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) 
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setHomeButtonEnabled(true);
        actionBar.setElevation(0);
    

但是按钮后退显示为蚂蚁,它没有做任何事情,如果我回击下面的 android 按钮,它会转到上一个活动:(

有用的链接:

Pass data from activity to fragment

【问题讨论】:

【参考方案1】:

一种选择是将屏幕实现为片段。

每个片段都有一个对活动的回调(例如 showNext)。 然后你可以为每个 Flow 实现一个 Activity。

例如 活动 1 显示片段 A -> B -> C -> D 活动 2 显示片段 A -> E -> C -> D 活动 3 显示片段 A -> F -> G -> D

这是干净且可扩展的,因为它分离了关注点。

片段:在屏幕上显示内容 活动:在屏幕之间导航

【讨论】:

所以当片段调用“显示下一个”时,包装器活动知道该调用谁?一旦显示新片段并且前一个片段从当前视图中删除,后退按钮会发生什么,后退按钮有一个堆栈引用会发生什么? (抱歉,我想再次确认我是否理解这种方法) 替换fragment时,只需将其添加到fragment后退栈中即可支持后退导航。

以上是关于如何使用可重用的活动在我的应用程序中定义不同的活动流?的主要内容,如果未能解决你的问题,请参考以下文章

如何从片段到活动而不会干扰片段的可重用性

如何从 Android AsyncTask 更改活动 UI?

如何启动在与小部件不同的包中定义的活动?

如何仅在我的活动页面中自定义导航项元素

在片段中,如何查找活动布局中定义的视图?

如何使用 Google 登录从不同的活动中退出用户?