public static ScrollView generateTeamLayout(Context context, boolean pit) { RelativeLayout layout = new RelativeLayout(context); ScrollView scrollView = new ScrollView(context); BufferedReader reader = new BufferedReader( new InputStreamReader( context .getResources() .openRawResource(pit ? R.raw.team_config_pit : R.raw.team_config_match))); try { String line = reader.readLine(); // The version Log.d( MainActivity.APP_TAG, "Loaded " + (pit ? "pit" : "match") + " config file version " + line); if (pit) configVersionPit = line; else configVersionMatch = line; int last = -1; while ((line = reader.readLine()) != null) { TextView header = null; View[] view; int idOffset = Integer.MAX_VALUE; String[] l; if (line.contains(":")) { l = line.split(":"); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); header = new TextView(context); header.setText(l[1].substring(2)); header.setTextSize(20f); header.setId(idOffset - View.generateViewId()); if (last != -1) { if (l[1].charAt(1) == '0') params.addRule(RelativeLayout.BELOW, last); else { params.addRule(RelativeLayout.RIGHT_OF, last); params.addRule(RelativeLayout.ALIGN_TOP, last); } } header.setPadding( header.getPaddingLeft(), header.getPaddingTop(), header.getPaddingRight() + 20, header.getPaddingBottom()); header.setLayoutParams(params); boolean below = false; switch (Integer.parseInt(l[1].charAt(0) + "")) { case 0: // Checkbox view = new View[] {new CheckBox(context)}; break; case 1: // Spinner Spinner spinner = new Spinner(context); ArrayList<String> l1 = new ArrayList<>(); l1.add("None"); l1.addAll(Arrays.asList(l[2].split(","))); spinner.setAdapter( new ArrayAdapter<>(context, android.R.layout.simple_spinner_dropdown_item, l1)); view = new View[] {spinner}; break; case 2: { // Number EditText editText = new EditText(context); editText.setInputType(InputType.TYPE_CLASS_NUMBER); editText.setSingleLine(); editText.setImeOptions(0x00000005); // Next view = new View[] {editText}; break; } case 3: { // Text EditText editText = new EditText(context); editText.setSingleLine(); editText.setImeOptions(0x00000005); // Next view = new View[] {editText}; break; } case 4: // Text for Teams AutoCompleteTextView autoCompleteTextView = new AutoCompleteTextView(context); autoCompleteTextView.setAdapter( new ArrayAdapter<>( context, android.R.layout.simple_dropdown_item_1line, MainActivity.teamList)); autoCompleteTextView.setSingleLine(); autoCompleteTextView.setImeOptions(0x00000005); // Next view = new View[] {autoCompleteTextView}; break; case 5: { // Multiline field EditText editText = new EditText(context); editText.setSingleLine(false); view = new View[] {editText}; below = true; break; } case 6: { // Number Entry with Plus final EditText editText = new EditText(context); ImageButton button = new ImageButton(context); button.setImageResource(R.drawable.ic_action_new); button.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { if (editText.getText().toString().equals("")) editText.setText("1"); else editText.setText( "" + (Integer.parseInt(editText.getText().toString()) + 1)); } }); editText.setInputType(InputType.TYPE_CLASS_NUMBER); editText.setSingleLine(); editText.setImeOptions(0x00000005); // Next view = new View[] {editText, button}; break; } default: Log.e( MainActivity.APP_TAG, "Invalid file format for team config, error at line: " + line); return null; } if (view.length == 1) { RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); if (below) params1.addRule(RelativeLayout.BELOW, header.getId()); else { params1.addRule(RelativeLayout.ALIGN_TOP, header.getId()); params1.addRule(RelativeLayout.RIGHT_OF, header.getId()); } view[0].setId(Integer.parseInt(l[0])); view[0].setLayoutParams(params1); } else { for (int i = 0; i < view.length; i++) { RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); if (i == 0) { if (below) params1.addRule(RelativeLayout.BELOW, header.getId()); else { params1.addRule(RelativeLayout.ALIGN_TOP, header.getId()); params1.addRule(RelativeLayout.RIGHT_OF, header.getId()); } view[0].setId(Integer.parseInt(l[0])); view[0].setLayoutParams(params1); continue; } params1.addRule(RelativeLayout.ALIGN_TOP, view[i - 1].getId()); params1.addRule(RelativeLayout.RIGHT_OF, view[i - 1].getId()); view[i].setId(Integer.parseInt(l[0]) + i); view[i].setLayoutParams(params1); } } } else { RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); TextView v = new TextView(context); v.setText(line); v.setTextSize(30f); v.setId(idOffset - View.generateViewId()); if (last != -1) params.addRule(RelativeLayout.BELOW, last); v.setLayoutParams(params); view = new View[] {v}; } if (header != null) layout.addView(header); for (View v : view) layout.addView(v); last = view[view.length - 1].getId(); } } catch (IOException e) { e.printStackTrace(); } scrollView.addView(layout); return scrollView; }