在运行时加载动态布局

时间:2012-02-21 18:11:34

标签: android layout

我有一个Android应用程序,可以使用webservice加载测验。该测验由几个问题组成,因此我需要动态构建布局,因为问题的数量可能会有所不同。

我的界面是这样的:

<LinearLayout android:orientation="vertical">
<ViewFlipper>

Question and possible answers ...

</ViewFlipper>
<HorizontalScrollView>
one button dynamically created for each question so I can navigate through the quiz...
</HorizontalScrollView>

我创建了另一个xml,其中包含一个布局样本,该样本应该用于显示应该为每个问题实例化并在ViewFlipper中注入的问题和答案。

我的问题是什么应该是正确的方法来完成这项任务?我是否需要在viewflipper中手动创建和插入所有视图,或者我可以使用我创建的模板吗?

每个问题也会有一些按钮(选择答案),我需要保存结果,我可以将它们提交给服务器并计算最终得分。

即使我必须更改应用程序的结构以便更容易编码,我也会很感激一些想法。

谢谢!

1 个答案:

答案 0 :(得分:0)

我建议在运行时在代码中创建和插入小部件。否则,您将从您使用的XML布局中获得固定数量的项目(除非您开始动态创建并向该布局添加小部件,这就是您可以立即执行的操作)

您需要做的就是获取要添加项目的视图的句柄,创建所需的窗口小部件,然后调用目标视图的addView方法。这是一个从我写的一些测试代码动态添加多个TextView的例子:

//Getting String[] data from intent
      String parts[] = myIntent.getStringExtra("parts");

      int length = parts.length;

      //Control ID's must NOT be zero, starting at 10
      int ids = 10; 
      for (int i = 0; i < length; i++) 
      {       
          RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
          TextView nextItem = new TextView(this);

      //Again, NEVER ZERO 
       nextItem.setId(ids); 
       nextItem.setText(parts[i]);
      //Checking if this is the first item added and setting it to be below the info widget (you can use any widget with an ID in your view)
       if(i==0) 
        { 
            params.addRule(RelativeLayout.BELOW, R.id.info); 
        } 
       else
        {
            params.addRule(RelativeLayout.BELOW, ids-1); 
        }
        nextItem.setLayoutParams(params);
        thisView.addView(nextItem, params);
        ids++; 
       }
      }