首页 > 解决方案 > 在 Android 运行时从 xml 文件设置视图

问题描述

我正在尝试制作允许“加载”.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) )

似乎需要该文件已经在编译时。有什么我想念的吗?

标签: androidxmlview

解决方案


正如你所描述的那样是不可能的。但是您可以通过 Java 代码来完成。

当我们在布局资源文件夹下创建布局 xml 文件并使用android:id="@+id/textview"IDE 提供一些 ID 时,会生成一个 ID R.java 文件,其中包含我们分配的所有 ID。

当我们从 Activity 或 Fragment 调用该视图时,我们使用该 ID 创建一个对象,例如

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

和用户。

如果您想将 xml 代码表单存储或服务器加载为 xml 格式的计划文本。您将为您的视图分配一些 ID。但是 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。


推荐阅读