Android 使用XML定位表单和文本窗口?
我正在做一个工作中的项目,有两个问题我不确定,如果有人能告诉我这是否可行,我将不胜感激 如果有一个XML文件,其中包含用于指示屏幕上对象位置的数据,那将是相当困难的。正在考虑存储坐标,然后解析坐标,并使用xml文档中存储的信息在Java中设置布局。你认为使用这种方法会变得太复杂吗 现在我怀疑这是可能的,但我只是想确定一下 B是否可以将EditText、TextView和其他小部件等存储在XML文件中,并使用Java对其进行解析,然后将其添加到布局中 提前感谢。对a和b: 我们这样做,效果很好: 更具体地说: 我们使用框架布局并动态地向其中添加UI元素。使用边距可以轻松设置大小和位置 B我们有一个活动,它可以显示XML文件中指定的任意表单。构建它只需要几百行代码,但效果很好 有关如何基于XML设置UI的一些代码: 首先,我假设您知道如何解析XML文件并将相关信息存储在对象中。在下面的示例中,包含XML文件中所有UI元素的视图称为frameAndroid 使用XML定位表单和文本窗口?,android,xml,android-layout,Android,Xml,Android Layout,我正在做一个工作中的项目,有两个问题我不确定,如果有人能告诉我这是否可行,我将不胜感激 如果有一个XML文件,其中包含用于指示屏幕上对象位置的数据,那将是相当困难的。正在考虑存储坐标,然后解析坐标,并使用xml文档中存储的信息在Java中设置布局。你认为使用这种方法会变得太复杂吗 现在我怀疑这是可能的,但我只是想确定一下 B是否可以将EditText、TextView和其他小部件等存储在XML文件中,并使用Java对其进行解析,然后将其添加到布局中 提前感谢。对a和b: 我们这样做,效果很好:
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));
}
现在可以将框架用于setContentView或将其添加到另一个视图组。
缺少getViewForContainer方法:
对于所有类型的UI元素都可以这样做。我将仅显示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;
}
以下是设置视图位置的方法。它仅适用于框架布局并使用边距。它还假设帧使用整个屏幕。如果你不想让它填满整个屏幕,那么就使用其他窗口宽度和高度
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);
}
正如我所说:几百行代码。使用类和工厂等也可以做得更好。。。但是你知道它是如何工作的:请你详细说明B点好吗?我不太清楚你的意思。我们有一个在XML文件中指定的表单。它由按钮、文本视图、编辑文本、单选按钮和复选框组成。我们解析XML文件并用它构建UI。我们的布局是一个有两列的TableLayout。在第一列中,有一个描述表单字段的文本,就像您的名字一样。第二列包含实际的表单元素,如EditText等。将表单元素添加到布局的代码是前面提到的几百行代码。基本上实施起来并不困难。根据您对Java和Android的熟悉程度,实现使用XML构建的布局只需几个小时。因此,您在Java类中有一个EditText、TextView、RadioButton等类型的数组,然后使用循环添加所需数量的数组?您可以看到,我的任务是创建一个程序,允许用户通过更改XML自定义应用程序。只是不确定如何定位每个小部件时,我不知道事先有多少文本视图,编辑文本等将需要。如果我使用一个循环来声明它们,那么如何使用解析的XML来定位每个单独的循环呢?当我解析数据时,我有一个包含存储所有解析数据的ArrayList的类。您是否也将所有解析的数据存储在ArrayList中?我有几个关于代码的问题,我不太确定。首先,请参阅page.getChildren。那是关于什么的?在XmlElement类中是否设置了变量?另外,如果我尝试使用params.setMargins,它会出现一个错误。我只做了一个月的android编程,我的工作还有很多东西要学,而且我没有接受任何工作培训,所有这些都是自学的。如果问题看起来有点基本,那么很抱歉:P
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);
}