а) и б):
Мы делаем это так, как работает, и отлично работает:)
Более конкретно:
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);
}
Как я уже сказал: несколько сотен строк кода. Можно также сделать это лучше, используя классы, фабрики и т. Д. ... но вы поймете, как это работает:)