首页 > 解决方案 > 在一项活动中加载单个片段两次,其中包含来自本地 json 文件的 2 个问题

问题描述

我有一个用于调查问题的本地 json,并且我创建了一个片段和活动,我想在其上显示带有活动的下一个和上一个按钮的片段。我的问题是我想同时用两个不同的问题显示相同的片段两次,并且还保留下一个和上一个的状态。例如。我有 15 个问题的列表,我想在同一活动中显示 2 个带有 2 个相同片段的问题,然后单击下一步,我想保存该状态,并再次希望在相同的活动中仅使用相同的片段加载第三个问题,然后单击上一个我想要带有 1 个和 2 个问题的 2 个片段我很困惑,如果有人可以提供帮助,我不知道该怎么做。

这是我进行一些调查的 json。

{
  "questions": [
    {
      "q_id": "1",
      "que": "how many working vehicles do you have?",
      "q_type": "type_number",
      "ans_id": "",
      "ans": "",
      "Option": [
        {
          "op_id": "1",
          "op_val": "1"
        },
        {
          "op_id": "2",
          "op_val": "2"
        }
      ]
    },
    {
      "q_id": "2",
      "que": "how many peoples are there in your house?",
      "q_type": "type_number",
      "ans_id": "",
      "ans": "",
      "Option": [
        {
          "op_id": "1",
          "op_val": "1"
        },
        {
          "op_id": "2",
          "op_val": "2"
        }
      ]
    }
  ]
}

这是我正在做的代码。我只是在一个布局中添加了所有问题我真的不知道如何做我所要求的问题以及如何保留下一个和上一个按钮的状态,我听说过单例和其他东西,但我不知道如何实现我想。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_registration);


    baseFragment = new BaseFragment();

    questions = Questions.AddAllQue(this);

    LinearLayout linearLayout = new LinearLayout(this);
    linearLayout.setOrientation(LinearLayout.VERTICAL);
    linearLayout.setId(View.generateViewId());

    for(int i=0;i<questions.size();i++ ){

        Bundle bundle = new Bundle();
        bundle.putParcelable("question",questions.get(i));

        getSupportFragmentManager()
                .beginTransaction()
                .add(linearLayout,basefragment)
                .commit();
    }
    flContainer.addView(linearLayout);

}

我想要像这个红色标记的东西是独立但相同的基本片段。

并单击下一个只有一个问题的相同基本片段,然后像此图像一样再次单击上一个,我的意思是相同的状态。

在此处输入图像描述

标签: androidandroid-fragments

解决方案


虽然我认为随着您的进步,您会有几个更详细的问题,但听起来您需要一些总体方向才能真正开始。

首先,我建议您不要对显示的两个问题中的每一个都使用相同的片段,而是要使用同一片段类的两个单独的实例。例如,我认为你会想要这样的东西:

questionOneFragment = new BaseFragment();
questionTwoFragment = new BaseFragment();

看起来你有一个问题列表,你只想一次显示两个,所以我认为你需要维护的唯一状态是应该显示哪个问题编号数据questionOneFragmentquestionTwoFragment应该在列表中显示问题的数据在问题二之后)。

为此,您只需要一个整数firstDisplayedQuestion,您可以根据单击prevandnext按钮来递增和递减。您需要管理该变量的边界,使其不会低于 0 或低于列表中最后一项的 1。

在您的BaseFragment课程中,您需要有设置您希望显示的 UI 元素的方法。然后,当单击prevnext按钮时,您会firstDisplayedQuestion相应地更新。然后,您还可以在对应的列表中获取问题的数据,并在使用该数据firstDisplayedQuestion时调用显示设置方法。questionOneFragment接下来,您在对应的列表中获取问题的数据,firstDisplayedQuestion + 1并使用该数据设置显示元素questionTwoFragment


推荐阅读