Настраиваемые поля ввода в приложении для Android

Я работаю над проектом для своего университета по настройке приложения Android во время выполнения.

Можно ли включить XML-файлы макета, которые на самом деле находятся не в папке \res\layout\ моего проекта Android, а на внешнем веб-сервере? Идея этого состоит в том, чтобы дать мне возможность настроить xml-файл на моем веб-сервере, например. добавление новых полей без переустановки/обновления приложения.

Попробую пояснить свою мысль на следующем примере:

Допустим, у меня есть приложение для сохранения и отображения адресов. Все адреса хранятся в базе данных. Я получил поля «имя» и «фамилия» в своей базе данных и отображал в приложении при сохранении или отображении адресов.

Теперь я хотел бы добавить третье поле «электронная почта», где я могу ввести адреса электронной почты.

Моя идея состоит в том, чтобы создать это поле в моей базе данных и добавить его в мой layout-xml-файл, который находится на моем веб-сервере. Таким образом, я могу «связать» XML-файл в приложении, и после обновления приложения появится новое поле.

Надеюсь, вы, ребята, можете дать мне некоторую информацию о том, как настроить мои формы ввода во время выполнения, мои исследования в Интернете мне совсем не помогли.

Гретц


person Sushislam    schedule 21.11.2012    source источник
comment
возможный дубликат Теоретический вопрос: загрузить внешний файл XML-Layout в Android   -  person PearsonArtPhoto    schedule 21.11.2012


Ответы (2)


Вы не можете использовать внешние файлы XML для динамической настройки макета.

Документация LayoutInflater#inflate(XmlPullParser, ViewGroup) объясняет почему:

Важно. Из соображений производительности инфляция представлений в значительной степени зависит от предварительной обработки XML-файлов, которая выполняется во время сборки. Поэтому в настоящее время невозможно использовать LayoutInflater с XmlPullParser поверх простого XML-файла во время выполнения.

Но вы можете динамически создавать свой макет в коде, см., например. Учебное пособие по макету среды выполнения Android

Таким образом, вы можете поместить на сервер файл, содержащий информацию о макете, получить его в своем приложении, проанализировать и динамически создать макет. Это будет много работы, так как вы будете в основном копировать Android LayoutInflater. Очевидно, что вы можете упростить формат до тех основ, которые вам нужны, но это все равно требует много работы, которая, ИМХО, не требуется.

Предположим, что ваша информация о макете — это просто текстовый файл с именами полей.

name
surname
email

Затем вы можете прочитать его построчно и создать простой EditText для каждого таким образом, как

private View getDynamicLayout(ArrayList<String> lines) {
    LinearLayout ll = new LinearLayout(this);
    for (String line : lines) {
        EditText et = new EditText(this);
        // fill it with some text
        et.setText(line);
        ll.addView(ll);
    }
    return ll;
}

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ArrayList<String> layoutConfig = readConfigFromFile();
    View layout = getDynamicLayout(layoutConfig);
    setContentView(layout);
}

Но если вам это действительно не нужно, я бы посоветовал вам обновить приложение обычным способом. Также быстрее использовать предварительно обработанные макеты, чем создавать эту информацию самостоятельно.

Также позаботьтесь о том, чтобы не делать тяжелый диск/любой доступ к сети в потоке пользовательского интерфейса, как в приведенном выше примере (чтение файла). Это должно быть сделано в фоновой задаче.

person zapl    schedule 21.11.2012

Спасибо большое за вашу помощь. Я постараюсь пройти через это.

Причина, по которой я не могу просто обновить приложение, заключается в том, что приложение, о котором я говорю, на самом деле является CRM-системой, используемой многими различными компаниями. Все они должны загрузить одно и то же приложение из магазина Google Play.

Цель моей работы заключается в том, чтобы каждая компания могла настраивать свои формы ввода по своему усмотрению, поэтому может быть много разных форм ввода (каждая для каждой компании), но все они используют одно и то же приложение.

Я думал о сервере, на котором хранится файл с информацией о макете, к которому приложение может получить доступ во время выполнения.

Кстати, поскольку я не инженер-программист, мне не нужно писать код, мне нужно только абстрактно описать концепцию.. :)

person Sushislam    schedule 22.11.2012