Android:更好的使用Fragments的方式

时间:2012-10-16 07:12:08

标签: android android-fragments

我想不出一个更好的问题标题:(

在我的应用程序中,我需要一个提问者,有10个问题,每次1个问题。

我做的是:

  1. 有1个活动说MainActivity,在其onCreate()中以编程方式添加片段,表示Frag_1

  2. 在Frag_1中,我有一个接口onButtonClickedListener,其方法为onClicked,可以回复“活动”以了解点击了哪个选项等。

  3. 在我的MainActivity中实现了onClicked此接口的方法,并在该方法中将片段更改为Frag_2(第二个问题),依此类推。

  4. 问题是:

    我最终获得了10个片段,而我的MainActivity实现了10个接口1每个片段。将来我可能有30-40个问题。

    修改

    每个问题都不相似。问题的答案选项是EditText / Spinner / RadioButtons等..所以我不能使用相同的片段,只需更改问题和答案选项文本。

    是否有更好,更有效的方法来解决这个问题

    谢谢

1 个答案:

答案 0 :(得分:1)

你快到了。 为MainActivity提供更广泛/通用的界面来实现。 也许类似于public void fragClickCallback(int fragId, Bundle data);

通过这种方式实现,您可以让switch() case知道哪个问题来自哪个,你的包可以为不同类型的答案打包不同的键(int表示radion按钮/微调器,字符串表示打开的答案等)

并且确保在每个片段事务上使用.replace(...)来删除片段。

修改

此外,有一些聪明的方法可以构建你的片段,而不必创建数十亿个片段。可以有多少种不同类型的问题?让我们算一下:

  • 多项选择(单一答案) - >整数(索引)
  • 多项选择(多个答案) - >整数(标志)
  • 号码输入 - >浮动/双
  • 修改文字 - >串
  • 日期选择器 - >长(划时代)
  • 时间选择器 - > 3个整数(?)

所以我们有6个片段和6种处理switch statement的方法,现在它只是将正确的参数传递给片段

修改

  @Override
   public void onSaveInstanceState(Bundle outState) {
       super.onSaveInstanceState(outState);
       outState.putInt("curChoice", mCurCheckPosition);
   }

然后在你的Fragment ActivityCreated()

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if (savedInstanceState != null) {
        // Restore last state for checked position.
        mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
    }
}

这些代码是从http://developer.android.com/reference/android/app/Fragment.html复制的。我建议您进一步阅读该页面。 该示例是恢复光标位置,但您可以使用它来恢复以前的用户答案(文本,整数,浮点数等)。