在 Android 运行时从 xml 文件设置视图

Posted

技术标签:

【中文标题】在 Android 运行时从 xml 文件设置视图【英文标题】:Setting View from xml file at runtime in Android 【发布时间】:2020-05-06 05:02:08 【问题描述】:

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

似乎要求该文件已经在编译时。我有什么遗漏吗?

【问题讨论】:

【参考方案1】:

好吧,它不可能从服务器加载 XML 并像通常的布局 XML 一样解析它。来自LatourInflaterdoc:

重要 出于性能原因,视图膨胀在很大程度上依赖于在构建时对 XML 文件进行的预处理。因此,目前无法在运行时将 LayoutInflater 与 XmlPullParser在纯 XML 文件上一起使用。

它与生成 ID 或类似机制无关,仅与性能有关 - 所以请考虑您确实需要此功能,它被阻止是有原因的;)

但如果您仍然真的想从第三方加载布局,您可以使用json2view lib。祝你好运!

【讨论】:

谢谢!虽然看起来这个方法还需要在xml上运行一个脚本在执行之前将其转换为json。【参考方案2】:

如你所描述的那样是不可能的。但是你可以通过 Java 代码来实现。

当我们在布局资源文件夹下创建一个布局 xml 文件并使用android:id="@+id/textview" IDE 生成一个 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。

【讨论】:

以上是关于在 Android 运行时从 xml 文件设置视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时从超级视图中删除视图?

Android中通过数组资源文件xml与适配器两种方式给ListView列表视图设置数据源

Android XML:在 XML 布局文件中将资源 ID 设置为 View 的标签

在运行时从 Android 主题获取默认属性值?

是否可以在运行时从 Android 应用程序动态加载库?

在 Unity 的运行时从文件动态加载带有 Texture2D 的纹理列表