Настройка View из файла xml во время выполнения в Android - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь создать простую программу, которая позволяет «загружать» файл. xml и отображать его как представление в setContentView нового действия. По сути, я хотел бы, чтобы представление о новом действии было бы таким же, как если бы я назвал

setContentView(R.layout.my_view)

, где R.layout.my_view - это файл xml. Но в моем случае этот файл еще не существует во время компиляции и должен быть загружен динамически (например, из хранилища).

Я думаю, я мог бы проанализировать мой. xml динамически создавайте и создавайте представление с помощью кода, но это похоже на изобретение колеса, и, скорее всего, представления не будут идентичны. Я думал, что должен быть какой-то простой способ сделать это, но все методы, которые я нашел так далеко от подобных вопросов (например,

getResources().getXml(R.layout.my_view); 
//or 
LayoutInflater.from(context).inflate(R.layout.my_view, null) )

, кажется, требуют файл уже во время компиляции. Есть ли что-то, что я ' м отсутствует?

Ответы [ 2 ]

1 голос
/ 20 января 2020

ну, невозможно загрузить XML с сервера и проанализировать его как обычный макет XML. от LatourInflater do c:

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

, и это не связано для генерации идентификаторов или аналогичного механизма, просто производительности - так что учтите, что вам действительно нужна эта функция, она почему-то заблокирована;)

, но если вы все еще действительно хотите загрузить макет от стороннего производителя, вы можете использовать json2view lib. удачи!

1 голос
/ 20 января 2020

Это невозможно, как вы описываете. Но вы можете сделать это с помощью Java кода.

Когда мы создаем файл макета xml в папке ресурсов макета и присваиваем некоторый идентификатор, используя android:id="@+id/textview" IDE, генерируем идентификатор R. java файл, который содержит все идентификаторы, которые мы назначаем.

Когда мы вызываем это представление из Деятельности или Фрагмента, мы создаем Объект с использованием этого идентификатора, например

TextView textview = (TextView) findViewById(R.id.textview);

и пользователя этого.

Если вы хотите загрузить xml хранилище формы кода или сервер в виде текста плана в формате xml. Вы назначите некоторый идентификатор для ваших просмотров. Но IDE не будет генерировать ID для этого. Таким образом, вы не можете создать объект из них.

Таким образом, решение заключается в том, что вы должны генерировать представление с помощью Java кода, что означает программно.

    setContentView(R.layout.activity_main);

    Display display = getWindowManager().getDefaultDisplay();
    int width = display.getWidth();
    width = width - (100/width)*80;

    LinearLayout layout = (LinearLayout) findViewById(R.id.lo_dynamic_view_container);
    LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);

    TextView tv = new TextView(this);
    tv.setLayoutParams(lparams);
    tv.setWidth(width);
    float redious [] = { 0, 0, 8.3f, 8.5f, 8.2f, 8.9f, 0, 0 };
    ShapeDrawable shape = new ShapeDrawable (new RoundRectShape(redious,null,null));
    shape.getPaint().setColor(Color.GREEN);
    tv.setBackground(shape);
    layout.addView(tv);

Здесь activity_main. xml будет иметь только один пустой макет LinearLayout. Вы можете сгенерировать представление в соответствии с вашим состоянием или формой документа хранения или сервера и добавить их в LinearLayout.

...