从命令行使用Gradle构建时,"程序包R不存在"错误

Bir*_*rei 24 java android gradle

我正在尝试Android使用Gradle命令行构建项目,但是当我想要更改目录结构时发现了一个问题.

目前是这样的:

.
??? main
    ??? AndroidManifest.xml
    ??? ic_launcher-web.png
    ??? java
    ?   ??? com 
    ?       ??? myproject
    ?           ??? MainActivity.java
    ??? res 
        ??? ... 
        ??? layout
        ?   ??? activity_main.xml
        ?   ??? fragment_main.xml
        ??? ... 
        ...
Run Code Online (Sandbox Code Playgroud)

然后我执行:

./gradlew clean build
Run Code Online (Sandbox Code Playgroud)

结束于:

BUILD SUCCESSFUL
Run Code Online (Sandbox Code Playgroud)

好.一切都很好.但现在我想创建一个新目录,所以:

我创建一个ui目录并移动到MainActivity.java那里:

.
??? main
    ??? AndroidManifest.xml
    ??? ic_launcher-web.png
    ??? java
    ?   ??? com
    ?       ??? myproject
    ?           ??? ui
    ?               ??? MainActivity.java
    ??? res
        ??? ...
        ??? layout
        ?   ??? activity_main.xml
        ?   ??? fragment_main.xml
        ??? ...
        ...
Run Code Online (Sandbox Code Playgroud)

修改其包裹:

package com.myproject.ui;

// imports

public class MainActivity extends ActionBarActivity {
    ...
}
Run Code Online (Sandbox Code Playgroud)

修改其android:name属性AndroidManifest.xml:

<activity 
    android:name=".ui.MainActivity" 
    android:label="@string/app_name" >
    ...
</activity>
Run Code Online (Sandbox Code Playgroud)

并尝试再次编译它:

./gradlew clean build
Run Code Online (Sandbox Code Playgroud)

有以下错误:

/home/birei/MyDummyProject/MyProject/src/main/java/com/myproject/ui/MainActivity.java:19: error: package R does not exist
        setContentView(R.layout.activity_main);
                        ^
/home/birei/MyDummyProject/MyProject/src/main/java/com/myproject/ui/MainActivity.java:23: error: package R does not exist
                    .add(R.id.container, new PlaceholderFragment())
                          ^
/home/birei/MyDummyProject/MyProject/src/main/java/com/myproject/ui/MainActivity.java:33: error: package R does not exist
        getMenuInflater().inflate(R.menu.main, menu);
                                   ^
/home/birei/MyDummyProject/MyProject/src/main/java/com/myproject/ui/MainActivity.java:43: error: package R does not exist
        if (id == R.id.action_settings) {
                   ^
/home/birei/MyDummyProject/MyProject/src/main/java/com/myproject/ui/MainActivity.java:60: error: package R does not exist
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);

BUILD FAILED
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?有任何想法吗?

谢谢.

loo*_*opj 53

当您在Activity中声明错误的包时,通常会发生这种情况.

确保package com.example.blah;您的活动中的package声明符合您的声明AndroidManifest.xml.


Bir*_*rei 29

我明白了,所以我会自己回答.

我必须R在那些使用在那里定义的任何资源的活动,片段或任何类中声明该类.

所以,它会是这样的:

package com.myproject.ui;

// lots of imports...
// ...
import com.myproject.R;

public class MainActivity extends ActionBarActivity {
    ...
}
Run Code Online (Sandbox Code Playgroud)


ste*_*s17 10

我收到此错误是因为我更改了.java文件中的包名称并重命名了目录但未更新AndroidManifest.xml.在AndroidManifest.xml中更改包名称解决了问题.这与上面的loopj的答案一致.

在适合我的Android项目中更改Java包名称的完整过程如下:

  1. 在.java文件中重命名包.
  2. 重命名包含.java文件的目录.
  3. 根据需要重命名AndroidManifest.xml中的包以及该文件中的其他项.
  4. 在build.gradle中重命名applicationId(应用程序的那个).