Позиционирование формы и текстовых виджетов с использованием XML? - PullRequest
0 голосов
/ 28 ноября 2011

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

A) Было бы этодовольно сложно иметь XML-файл, который будет содержать данные, которые будут использоваться для определения местоположения объектов на экране.Думал сохранить координаты, затем проанализировать координаты и настроить макет в Java, используя информацию, хранящуюся в документе xml.Считаете ли вы, что это слишком сложное использование этого метода?

Теперь я сомневаюсь, что это возможно, но просто хочу быть уверен.

B) Возможно ли сохранить EditText,TextView, другие виджеты и т. Д. В XML-файле и его синтаксический анализ с использованием Java, а затем добавление его в макет?

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

1 Ответ

0 голосов
/ 28 ноября 2011

а) и б):

Мы делаем это так, как работает, и отлично работает:)

Более конкретно:

A) Мы используем FrameLayout и динамически добавляем к нему элементы пользовательского интерфейса. Используя поля легко установить размер и положение

B) У нас есть действие, которое может отображать произвольные формы, указанные в файле XML. для его построения требуется несколько сотен строк кода, но он отлично работает.


Некоторый код о том, как настроить пользовательский интерфейс на основе XML:

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

    FrameLayout frame = new FrameLayout(context);

    // assemble views
    // XmlElement is one element in the XML file
    // page and cntnr are of type XmlElement
    for (XmlElement cntnr : page.getChildren())
    {
        content.addView(getViewForContainer(cntnr, context));
    }

Теперь вы можете использовать frame для setContentView или добавить его к другому ViewGroup. Отсутствует метод getViewForContainer:

private static View getViewForContainer(XmlElement cntnr,
        Activity context)
{
    Rect bounds = cntnr.getBounds();
    int w = bounds.right;
    int h = bounds.bottom;

    // here is your View
    View ret = new View(context);

    // do this for all kinds of container
    // type is an enum that defines what kind of UI element 
    // a XML element is.
    switch (cntnr.getType())
    {
        case IMAGE:
            ret = createImage(context, pageContainer);
            break;
        case VIDEO:
            ret = createVideo(context, pageContainer);
            break;
        case AUDIO:
            ret = createAudio(context, pageContainer, page);
            break;
        ...
        case TEXT_FIELD:
            ret = createTextField(context, pageContainer);
            break;
    }

    return ret;
}

Вы делаете это для всех видов элементов пользовательского интерфейса. Я просто покажу createImage() в качестве примера:

private static View createImage(Activity context,
        XmlElement page)
{
    ImageView iv = new ImageView(context);
    iv.setImageBitmap(BitmapFactory.decodeFile(RessourceLoader
                .getFilesDirectory() + page.getFile()));

    setImageViewPosition(iv, page);
    return iv;
}

Вот метод установки положения просмотра. Он работает только для FrameLayouts и использует поля. Также предполагается, что frame использует весь экран. Если вы не хотите, чтобы он занимал весь экран, используйте другие значения windowWidth и -Height.

private static void setViewPosition(View view, Activity context,
    XmlElement page)
{
        final int windowWidth = context.getWindowManager().getDefaultDisplay().getWidth();
        final int windowHeight = context.getWindowManager().getDefaultDisplay().getHeight();
    Rect bounds = page.getBounds();
        int x = bounds.left;
    int y = bounds.top;
        int w = bounds.right;
        int h = bounds.bottom;

        LayoutParams params = new LayoutParams(w != 0 ? w : android.view.ViewGroup.LayoutParams.WRAP_CONTENT, h != 0 ? h : android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
        params.setMargins(x, y, w != 0 ? windowWidth - w - x : 0, h != 0 ? windowHeight - h - y : 0);
            view.setLayoutParams(params);
}

Как я уже сказал: несколько сотен строк кода. Можно также сделать это лучше, используя классы, фабрики и т. Д. ... но вы поймете, как это работает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...