2015-08-31 155 views
5

我正在开发android应用程序,并且正在使用Android Studio。在Android Studio中更改xml布局文件后需要重建

虽然有一个问题。当我更改和我运行该应用程序它工作正常,但是当我更改资源它不会更改,直到我做清洁项目。例如我添加一个按钮并运行应用程序,该按钮不存在,但是当我做一个干净的项目时,它就在那里。访问新增视图的id时,Android Studio会显示错误。

请帮我解决这个问题。任何帮助将非常感激。

其他信息: -Android Studio版本:1.3.1 - 操作系统:窗 -Gradle版本: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' 
     ] 
    } 
} 

当我尝试运行该项目与更改后的布局它说:

No apk changes detected. Skipping file upload, force stopping package instead. DEVICE SHELL COMMAND: am force-stop com.my.package

+0

'Android工作室在访问新添加的视图的ID时显示错误...并且错误是? –

+0

@ FrankN.Stein它变红了,因为它没有找到编号 –

+0

可能是错误?更改布局后,请尝试切换到java文件。然后按Ctrl-S重新保存java文件。这必须更快,项目清洁 –

回答

1

我不使用嵌套资源文件夹解决了我的问题。我有多个资源文件夹。解决方法是在res文件夹旁边创建其他资源文件夹,而不是在其中。我喜欢这个改变的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/test', 
      'src/main/login', 
      'src/main/main', 
      'src/main/includes' 
     ] 
    } 
} 

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

+0

Works,谢谢你。添加一个res-前缀到每个资源组m阿克斯结构看起来很漂亮。 –

0

这是一个黑客和低效率的解决方法。

在你的module_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。

希望他们尽快修复该插件。

+0

这是一个使用风味和类型的android应用程序的设置,如果它是一个库,你会得到不同的变体名称,如果你不使用风味,你可能会能够跳过整个顶部,直接在任务循环中引用'android.applicationVariants.all'。 – TrevJonez

2

解决方案是不具有嵌套的资源目录。将所有布局保留在/ res/layout /文件夹下。您可以使用一些前缀(如test_xxxx或login_xxxx)将它们缩短。

无论如何,出于某种原因,Gradle只在进行增量构建时才会对布局主目录中的更改进行计数。除非对项目进行干净和完整的重建,否则任何其他子文件夹中的更改都不会被察觉。

如果有人知道如何将资源的子文件夹和避免这样的问题的同时,请让我知道...

+1

[请仅使用Answers解答问题](// meta.stackoverflow.com/q/92107)。如果你愿意,你可以把它作为一个单独的新问题发布。 – Mogsdad

+0

我添加了对我有效的答案。 –

相关问题