【问题标题】:Is it possible to create a view from an xml file in the assets directory?是否可以从资产目录中的 xml 文件创建视图?
【发布时间】:2011-03-30 05:35:30
【问题描述】:

我有一个应用程序,将所有布局放在 res/layout 文件夹中变得非常大且难以管理。我想要所有布局的文件夹。我读过布局文件夹内不能有子目录,但资产文件夹中可能有子目录。所以我的问题是,如何访问文件并将其设置为资产目录中文件的视图?类似于以下内容

int assetId = getAssets().open("main.xml");
setContentView(assetId)

上面的代码可以工作吗?我将如何为我的视图设置该 xml 文件? 谢谢。

【问题讨论】:

  • 你好@skoko,你做到这一点了吗?我也一样

标签: android assets


【解决方案1】:

您可以通过使用自定义脚本并在构建执行之前运行它来实现此目的。 Android 似乎会忽略布局子目录中的任何内容,因此您可以安全地将文件放入其中。下面的 ruby​​ 脚本(为 Linux 编写,但很容易转换到其他平台)将删除 res/layout/ 中不是目录的所有内容,并将子目录中的每个文件复制到 res/layout/:

#!/usr/bin/ruby

require "fileutils"

def collect_files(directory)
    FileUtils.cd(directory)
    FileUtils.rm(Dir.entries(directory).reject{|x| File.directory?(x)}) #Remove all layout files in base dir
    files_to_copy=Dir.glob("**/*").reject{|x| File.directory?(x)}
    files_to_copy.each{|x| print "Copying #{x} to #{directory}\n"}
    FileUtils.cp(files_to_copy, directory) #Copy all files in subdir into base dir
end

if ARGV[0]!=nil && File.directory?(ARGV[0])
    xml_dir=ARGV[0]
    layout_dir="#{xml_dir}/layout"
    collect_files(layout_dir)
else
    puts("Must specify a valid directory!")
end

请注意,上述脚本并不可靠,实际上会删除子目录中的所有布局文件not。如果您愿意,您可以随时删除删除步骤,但是您从子目录中删除的任何文件都将保留在主目录中以供后续构建使用。

如果您正在运行 Eclipse,那么您可以配置一个外部工具,您可以稍后将其添加到您的构建器中。只需打开运行 -> 外部工具 -> 外部工具配置,然后在“程序”下创建一个新工具。这是我的设置的屏幕截图:

注意:工作目录是红鲱鱼,不会被使用。您需要指定放置脚本的位置,而不是此处显示的位置

现在您可以将该工具添加到项目的构建器中。选择您的项目并打开项目 -> 属性。现在选择“Builders”项目并单击“Import”。如果您成功定义了它,您应该在那里看到您的工具。它需要在构建过程的其余部分之前运行,因此请确保将其移至列表顶部。完成后应该是这样的:

现在您只需将布局文件移动到子目录中(但要注意名称冲突,记住这些文件最终都将位于同一目录中以进行构建!)并构建您的项目。当您执行此操作时,您会看到它们神奇地出现在 /res/layout/ 的根目录中,然后您的应用应该会正常构建。

Caveat Scriptor:如果您要指定多个布局,或者其他任何不只是使用 /res/layout/ 目录的东西,您需要扩展此脚本或多次添加该工具让不同的目录来处理它。我个人不使用这种技术,所以还没有看到它的失败之处,但是已经用一个基本的 android Hello World 应用程序进行了测试,在一些子目录中有几个布局。

另外,如果使用包含空格的路径,我的脚本会中断!

【讨论】:

    【解决方案2】:

    简短的回答:不能那样做。 主要原因:

    • res/layout 文件夹中的所有.xml 文件都已预编译,因此Android 可以将它们用作资源。在assets 文件夹中,所有文件都保持不变,因此应用程序可以将它们作为常规文件读取。 (在您的代码示例中,您会得到 InputStream,而不是资源 ID)。
    • Android 自动管理位于 res/layout 文件夹中的布局,搜索与当前屏幕分辨率、方向、区域设置等最匹配的布局。

    【讨论】:

      【解决方案3】:

      layoutinflator 可能会帮助你 看这里 What does LayoutInflater in Android do?

      【讨论】:

        【解决方案4】:

        我认为这不是一个好主意,而且可能只是行不通。例如,如果框架认为它需要你的布局的 hdpi 版本,它会怎么做?

        您可能会尝试寻找布局扩散的根本原因:

        • 您能否为您的布局制定更好的命名约定?
        • 能否重构某些布局,以便更多组件可以重用相同的布局?
        • 您是否手动处理方向而不是依赖-portrait-landscape

        【讨论】:

          猜你喜欢
          • 2014-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-11
          • 1970-01-01
          • 2011-09-05
          • 2013-04-03
          • 1970-01-01
          相关资源
          最近更新 更多