Создавайте настраиваемые поля, программно объединяя Textview и EditText

Я работаю над созданием динамической формы из строк, полученных из ответа JSON API.

Здесь я хочу создать динамическую форму, в которой я хочу идентифицировать {field_name} и заменить ее на EditText.

Приведенная ниже строка является строкой, полученной из ответа API, и да, она содержит "{}" как часть строки.

Поэтому я нахожу их с помощью цикла while и создаю EditText каждый раз, когда найден {}.

Теперь проблема, которую я не могу решить, заключается в том, как добавить эти EditText в String/TextView.

Например,

String demo = "{event_name} Event on{event_date} at {event_time} venue {event_venue} All are welcome. -";

Pattern p = Pattern.compile("\\{([^}]*)\\}");
Matcher m = p.matcher(str);

EditText et;

while (m.find()) {
   LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width, 
   LinearLayout.LayoutParams.WRAP_CONTENT);
   lp.setMargins(10, 10, 10, 10);
   et = new EditText(this);
   Log.e("onCreateInternal: ", "=" + i);

   SmsTypeGroup.addView(et, lp)
}

После замены {} на EditText из строки желаемый результат будет таким, как показано ниже.

Необходимый вывод показан на этом изображении

Любая помощь будет здорово.

Заранее спасибо.

Примечание. Единственным условием является то, что весь процесс должен выполняться программно из файла Java, без использования XML.


person Chirag Desai    schedule 16.04.2019    source источник


Ответы (1)


Я так понимаю, что английский не является вашим родным языком, но если я правильно понимаю, то, что вы получаете прямо сейчас, — это просто представление с 4 editText, и вам нужен способ дополнительно добавить текстовые представления с текстом между элементами {} в строке.

один из способов сделать это — использовать split вместо сопоставления с образцом:

String demo = "{event_name} Event on{event_date} at {event_time} venue {event_venue} All are welcome. -";
String[] parts = demo.split("}");

EditText et;

for(String part : parts){
   LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width, LinearLayout.LayoutParams.WRAP_CONTENT);
   lp.setMargins(10, 10, 10, 10);
   et = new EditText(this);

   SmsTypeGroup.addView(et, lp);

   String[] _parts = part.split("{");
   if(_parts.length >1){
     TextView tv = new TextView(this);
     tv.text = _parts.[0];
     SmsTypeGroup.addView(tv, lp)
   }
}
person Joachim Haglund    schedule 16.04.2019
comment
Спасибо за помощь. С небольшими изменениями это идеальный ответ на мою проблему. - person Chirag Desai; 17.04.2019
comment
Рад был помочь:) - person Joachim Haglund; 17.04.2019