【问题标题】:Activities loading xml layout dynamically in android活动在android中动态加载xml布局
【发布时间】:2011-07-16 13:11:58
【问题描述】:

是否可以从存储在设备中的资源(在数据库或部分资源中)加载活动的 xml 布局文件并在该活动启动时动态加载它?我们的想法是将其从 Web 服务发送到设备。谢谢。

【问题讨论】:

    标签: java android android-activity


    【解决方案1】:

    如果您尝试扩充构建过程中未包含的 XML 文件,我认为目前不可能。这是来自LayoutInflater class 的java-docs:

    查看 android.view.LayoutInflater.inflate(XmlPullParser 解析器, ViewGroup root, boolean attachToRoot)

    从指定的 XML 节点扩展一个新的视图层次结构。投掷 InflateException 如果有错误。

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

    【讨论】:

    【解决方案2】:

    截至本文发布之日,Android 仅包含一种内置方式来扩充作为布局资源存储在 APK 文件中的布局 XML。如果您想从其他来源扩充类似(或不同)的 XML,您将不得不自己实现,可能通过从 LayoutInflater 类中克隆一些逻辑来实现。请注意,Android 做了很多工作来优化运行时资源文件的读取和解析,所以如果您打算自己动态加载它,请准备好让它膨胀得更慢。

    【讨论】:

      【解决方案3】:

      如果你必须从数据库加载信息,也许它可以帮助你做一个基本的 XML,并在上面插入信息,比如一个表或类似的东西。你可以试试这样:

      在基本表 XML 中:

      <?xml version="1.0" encoding="utf-8"?>
      <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:stretchColumns="1"
      android:id="@+id/SensorInfoTableLayout">
      
      <TableRow>
          <TextView
                  android:text="@string/sensor_name_title"
                  android:padding="3dip" /> 
          <TextView
                  android:text="@string/sensor_type_title"
                  android:padding="3dip" />
          <TextView
                  android:text="@string/sensor_value_title"
                  android:padding="3dip" />
          <TextView
                  android:text="@string/sensor_unit_title"
                  android:padding="3dip" />
      </TableRow>
      
      <View
          android:layout_height="4dip"
          android:background="#FF909090" /></TableLayout>
      

      还有代码:

      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState); 
      
          getSensorInfo();
          setContentView(R.layout.sensorinfo);
      
          setInfoByView();
      }
      
      private void setInfoByView() {
          TableLayout myTableLayout = null;
          myTableLayout = (TableLayout)findViewById(R.id.SensorInfoTableLayout);
      
          // Add row to table
          myTableLayout.addView(createRow("maxRange",maxRangeType, "" + maxRange ,maxRangeUnits));
          myTableLayout.addView(createRow("minDelay",minDelayType,"" + minDelay, minDelayUnits));
          myTableLayout.addView(createRow("name",nameType,"" + name, nameUnits));
          myTableLayout.addView(createRow("powerReq",powerReqType,"" + powerReq, powerReqUnits));
          myTableLayout.addView(createRow("resolution",resolutionType,"" + resolution, resolutionUnits));
          myTableLayout.addView(createRow("type",typeType,"" + type, typeUnits));
          myTableLayout.addView(createRow("vendor",vendorType,"" + vendor, vendorUnits));
          myTableLayout.addView(createRow("version",versionType,"" + version, versionUnits));
      }
      
      private TableRow createRow(String name, String type, String value, String unit) {
          // Create new row
          TableRow myTableRow = new TableRow(this);
          myTableRow.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
          //myTableRow.setGravity(Gravity.CENTER_HORIZONTAL);
          myTableRow.setPadding(5, 5, 5, 5);
          // Add name
          myTableRow.addView(createTextView(name));
          // Add type
          myTableRow.addView(createTextView(type));
          // Add value
          myTableRow.addView(createTextView(value));
          // Add units
          myTableRow.addView(createTextView(unit));
      
          return myTableRow;
      }
      

      在XML中,它只存在主体栏,有名称、标题、值和单位。并且动态地添加带有信息和样式的行。

      也许它有帮助,它对我有用。

      【讨论】:

        【解决方案4】:

        flipkart 的人为 Android 的 LayoutInflater 创建了一个替代方案,它接受 JSON,可以在任何地方托管。它还接受可选数据,用于将数据绑定到原生膨胀视图。

        用于视图的示例 JSON

        {    
          "type": "LinearLayout",
          "orientation": "vertical",
          "padding": "16dp",
          "children": [{
            "layout_width": "200dp",
           "gravity": "center",
            "type": "TextView",
            "text": "@{user.profile.name}"
          }, {
            "type": "HorizontalProgressBar",
            "layout_width": "200dp",
            "layout_marginTop": "8dp",
            "max": 6000,
            "progress": "@{user.profile.experience}"
          }]
        }
        

        示例数据 JSON:

        {
          "user": {
            "profile": {
              "name": "John Doe",
              "experience": 4192
            }
          }
        }
        

        动态膨胀:通过将 ProteusView 包含在项目中来使用它:

        ProteusView view = proteusLayoutInflater.inflate(<layout>, <data>);
        container.addView(view.getAsView());
        

        以下是作者自己的介绍: https://www.slideshare.net/mobile/KiranKumar1320/proteus-android-layout-engine

        在这里看看: https://github.com/flipkart-incubator/proteus/blob/master/README.md

        【讨论】:

          【解决方案5】:

          是否可以从存储在设备中的资源加载活动的 xml 布局文件

          是的。

          View inflatedView = View.inflate(this, R.layout.sample, null);
          container.addView(inflatedView);
          

          正如@Chirag Raval 所说。

          是否可以从 db / web 服务加载 activity's xml 布局文件?

          不这么认为。因为您从R.layout.XPTO 调用的布局reference (id) 是预编译的。您不能在运行时添加值。


          您可以使用(以及我在某些应用程序中使用的)的中期选项设置了一个预定数量的“块”,可以根据数据重新排列已发送。

          示例:

          Receive text, image, text + image
          

          加载:text_block.xml 然后image_block.xml 然后text_and_image_block.xml

          【讨论】:

          • 我认为你在第二个问题中遗漏了一些词......Is it possible to load an activity's xml layout file from a db / web service.
          【解决方案6】:

          正如其他答案中所解释的那样,“开箱即用”是不可能的,但开源项目ItsNat Droid 努力提供类似于“原生”的远程下载的基于 Android 原生 XML 的资源 (HTTP) 的呈现Android" 浏览器,基于原生 Android 的 XML 而不是 HTML 和 Beanshell 脚本而不是 JavaScript。

          显然,性能不会与本地预编译的原生资源相同。这类似于将 Web 应用程序与桌面应用程序进行比较,Web 应用程序可以满足大多数需求,但不适用于游戏,在 Android 本地/远程非常相似。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-04-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-25
            相关资源
            最近更新 更多