当前位置: 首页 > 知识库问答 >
问题:

在Android Studio中更改xml布局文件后需要重建

尤茂材
2023-03-14

我正在开发android应用程序,我正在使用android Studio。

但是有一个问题。当我更改源代码并运行应用程序时,它工作正常,但当我更改资源时,它不会更改,直到我完成一个干净的项目。e、 g.我添加一个按钮并运行应用程序,该按钮不存在,但当我执行一个干净的项目时,它就在那里。Android studio在访问新添加视图的id时显示错误。

请帮我解决这个问题。任何帮助都将不胜感激。

附加信息:-Android Studio版本:1.3。1-操作系统:windows-渐变版本:2.6

编辑:

我有多个目录作为gradle的资源,如下所示:

sourceSets{
     main  {
         manifest.srcFile 'src/main/AndroidManifest.xml'
         java.srcDirs = ['src/main/java', '.apt_generated']
         aidl.srcDirs = ['src/main/aidl', '.apt_generated']
         res.srcDirs = [
            'src/main/res',
            'src/main/res/layouts/test',
            'src/main/res/layouts/login',
            'src/main/res/layouts/main',
            'src/main/res/layouts/includes'
        ]
    }
}

当我试图运行改变布局的项目时,它会说:

未检测到apk更改。跳过文件上载,改为强制停止包。设备外壳命令:am force stop com。我的包装

共有3个答案

梁丘权
2023-03-14

解决方法是不使用嵌套的资源目录。将所有布局放在 /res/layout/文件夹下。您可以使用test_xxxx或login_xxxx等前缀缩短它们。

无论如何,出于某种原因,Gradle在进行增量构建时只考虑布局主目录中的更改。在对项目进行干净和完整的重建之前,不会注意到任何其他子文件夹中的更改。

如果有人知道如何包括资源子文件夹,同时避免这个问题,请让我知道。。。

龙欣德
2023-03-14

这里有一个更新的方法,以获得相同的效果,无论风味配置:

android.applicationVariants.all { variant ->
  tasks.named("generate${variant.name.capitalize()}Resources").configure { mergeResourceTask ->
    mergeResourceTask.outputs.upToDateWhen { false }
  }
  tasks.named("merge${variant.name.capitalize()}Resources").configure { mergeResourceTask ->
    mergeResourceTask.outputs.upToDateWhen { false }
  }
}

对于根本问题来说,这仍然是一个非常糟糕的解决方法。它会使任何最新的或任务输出缓存无效,否则会通过跳过这些任务使非资源更改的构建更快。

正确的解决方案是,不要使用嵌套的资源目录,因为android gradle插件最初是设计用来支持的。通过不嵌套,在向源集合添加目录时,任务输入应该正确声明,gradle将正确确定何时运行任务。

如果仍要嵌套资源目录,请通读本自述:https://github.com/davebren/ResourceNestingExample具体来说:奇怪的是,在声明容器资源文件夹的子资源文件夹之前,不能声明该文件夹

我原来的答覆是:

这是一个老套而低效的解决方法。

在您的模块中_dir/build。gradle添加以下代码。

afterEvaluate {
  def flavors = []
  def types = []

  android.applicationVariants.all { variant ->
    def flyp = variant.name.split("(?=\\p{Upper})")
    if (!flavors.contains(flyp[0]))
    {
        flavors.add(flyp[0])
    }
    if (!types.contains(flyp[1]))
    {
        types.add(flyp[1])
    }
  }

  tasks.all { Task task ->

    for (String fl : flavors)
    {
      for (String ype : types)
        {
            if (task.name.contains("generate${fl.capitalize()}${ype.capitalize()}Resources") || 
                task.name.contains("merge${fl.capitalize()}${ype.capitalize()}Resources"))
            {
                task.outputs.upToDateWhen { false }
            }
        }
    }
}

这将使gradle构建重新生成并合并每个构建的资源。在一个三层深的循环之上,增量生成的损失使得这是一个可怕的代码块。

在将它添加到我的项目中之前,只需一行java代码即可在约31秒和添加后约35秒内更改构建。

希望他们尽快修复插件。

鲜于德泽
2023-03-14

我通过不使用嵌套的资源文件夹解决了问题。不过我有多个资源文件夹。解决方法是在res文件夹旁边(而不是其中)创建其他资源文件夹。我的梯度变化如下:

sourceSets{
     main  {
         manifest.srcFile 'src/main/AndroidManifest.xml'
         java.srcDirs = ['src/main/java', '.apt_generated']
         aidl.srcDirs = ['src/main/aidl', '.apt_generated']
         res.srcDirs = [
            'src/main/res',
            'src/main/test',
            'src/main/login',
            'src/main/main',
            'src/main/includes'
        ]
    }
}

额外资源文件夹中的所有更改现在都生效,无需清理和重建项目。我希望它能帮助你。

 类似资料:
  • 问题内容: 如果我更改了php.ini文件中的设置,是否需要重新启动Apache才能使其生效? 问题答案: 实际上取决于。取决于您如何在该Web服务器中使用php: 使用php一个模块:您必须重新启动服务器进程 使用PHP作为CGI后端:你 没有 重新启动服务器进程 使用php fastcgi:不确定,实际上…(但是重启是安全的) 使用PHP-FPM:您必须重新启动fpm服务器进程以防止不一致

  • 我以前在我的Java项目中与Maven一起工作,但今天我开始与AndroidStudio打交道。 我看到它鼓励使用Gradle,我没有问题学习新的工具。所以我开始了一个非常基本的Android手机应用程序的例子,当我点击一个按钮时,它只说“你好世界”。 我把app/src推到一个Git repo中,并尝试将我的作品放到另一台电脑上,但它并不理解我的项目是Android的项目。我可能错过了一个Gra

  • 我在读关于Android编程中的TextWatcher的文章。我无法理解和之间的区别。 虽然我提到了TextWatcher的onTextChanged、beforeTextChanged和postTextChanged之间的差异,但我仍然无法想到需要使用而不是的情况。

  • 到目前为止,我处理样式的经验是创建一个style.xml文件,并为样式创建我想要的属性。如果我希望我的样式基于现有的样式,我使用父属性。然后,我在要应用样式的控件上的布局文件中指定样式。 我无所适从的地方是当我想使用系统样式并且只更新某些属性时。我想知道我是否可以离开布局文件单独和不打扰应用任何样式到控件。相反,我会以某种方式更新系统样式的属性,这将更新我的应用程序中默认已经使用该样式的任何地方。

  • 问题内容: 这是功课。入门Java类。仍然把我的头缠在这东西上。 该项目是要建立一个库存管理系统。 除了如何使此按钮更改JTextField中的文本外,我已经弄清楚了一切。它需要从产品阵列(在本例中为DVD)中添加信息。这本书讨论了管理诸如JTextField的字体,位置和状态之类的不同方法,但是没有涉及格式化或调用文本的方法。 这是我要使用JTextArea进行操作的示例。从本质上讲,这就是我想

  • 本文向大家介绍Android 布局文件Layout XML属性,包括了Android 布局文件Layout XML属性的使用技巧和注意事项,需要的朋友参考一下 Layout对于迅速的搭建界面和提高界面在不同分辨率的屏幕上的适应性具有很大的作用。这里简要介绍Android的Layout和研究 一下它的实现。 Android有Layout:FrameLayout,LinearLayout,TableL