R无法解析为变量

时间:2011-04-08 08:58:25

标签: android

我想解决此错误

  

R无法解析为变量

我查了很多答案,但我找不到合适的答案;我尝试了一切。有谁可以帮助我?

我自动创建的主要活动。从case R.id.button1:开始的三行显示错误:

package de.vogella.android.temprature1;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.Toast;

public class Convert extends Activity {
    private EditText text;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        text = (EditText) findViewById(R.id.editText1);
    }

    // This method is called at button click because we assigned the name to the
    // "On Click property" of the button
    public void myClickHandler(View view) {
    switch (view.getId()) {
        case R.id.button1:
            RadioButton celsiusButton = (RadioButton) findViewById(R.id.radio0);
            RadioButton fahrenheitButton = (RadioButton) findViewById(R.id.radio1);
            if (text.getText().length() == 0) {
                Toast.makeText(this, "Please enter a valid number",
                Toast.LENGTH_LONG).show();
                return;
            }

            float inputValue = Float.parseFloat(text.getText().toString());
            if (celsiusButton.isChecked()) {
                text.setText(String.valueOf(convertFahrenheitToCelsius(inputValue)));
            } else {
                text.setText(String.valueOf(convertCelsiusToFahrenheit(inputValue)));
            }

            // Switch to the other button
            if (fahrenheitButton.isChecked()) {
                fahrenheitButton.setChecked(false);
                celsiusButton.setChecked(true);
            } else {
                fahrenheitButton.setChecked(true);
                celsiusButton.setChecked(false);
            }
            break;
        }
    }

    // Converts to celsius
    private float convertFahrenheitToCelsius(float fahrenheit) {
        return ((fahrenheit - 32) * 5 / 9);
    }

    // Converts to fahrenheit
    private float convertCelsiusToFahrenheit(float celsius) {
        return ((celsius * 9) / 5) + 32;
    }
}

我的main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:background="@color/myColor">
    <EditText android:layout_height="wrap_content" android:id="@+id/editText1"
        android:layout_width="match_parent" android:inputType="numberDecimal|numberSigned"></EditText>
    <RadioGroup android:layout_height="wrap_content" android:id="@+id/radioGroup1"
        android:layout_width="match_parent">
        <RadioButton android:layout_width="wrap_content"
            android:id="@+id/radio0" android:layout_height="wrap_content"
            android:text="@string/celsius" android:checked="true"></RadioButton>
        <RadioButton android:layout_width="wrap_content"
            android:id="@+id/radio1" android:layout_height="wrap_content"
            android:text="@string/fahrenheit"></RadioButton>
    </RadioGroup>
    <Button android:id="@+id/button1" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:text="@string/calc"
        android:onClick="myClickHandler"></Button>
</LinearLayout>

my string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, Convert!</string>
    <string name="app_name">de.vogella.android.temprature1</string>
<string name="myClickHandler">myClickHandler</string>
<string name="celsius">to Celsius</string>
<string name="farenheit">to Farenheit</string>
<string name="calc">Calculate</string>
</resources>

29 个答案:

答案 0 :(得分:19)

1)查看Package Explorer树中的xml文件是否有错误图标 如果他们这样做,修复错误并生成R-class。

示例提示:FILL_PARENT在API级别8中重命名为MATCH_PARENT;因此,如果您的目标是平台2.1(api 7),请将所有出现的内容更改回“fill_parent”

2)如果你添加了“import android.R;”试图快速修复,删除该行

答案 1 :(得分:16)

对我来说,向“R”文件存在问题的人建议的最佳解决方案是尝试后续步骤(顺序无关紧要):

  1. 更新ADT&amp; SDK,Eclipse和Java(1.6和最新版本)。

    编辑:现在ADT支持Java 1.7。链接here

  2. 删除gen文件夹,然后重新创建。

  3. 做一个清洁项目。

  4. 右键单击该项目并选择android-tools - &gt;修复项目属性。

  5. 右键单击项目并选择属性 - &gt; java-build-path - &gt;订单和出口。确保订单是:

    • Android 4.4(始终是最新版本)

    • Android私人图书馆

    • android依赖

    • 您的图书馆项目(如果需要)

    • yourAppProject /根

    • yourAppProject / SRC

  6. 确保res文件夹的子文件夹中的所有文件都有正确的名称:只有小写字母,数字和下划线(“_”)。

  7. 始终确保targetSdk指向最新的API(当前为19),并将其设置在project.properties文件中

  8. 尝试运行Lint并阅读其警告。他们可能会帮助你。

  9. 确保您的项目编译1.6 java而不是其他版本。

  10. 重启eclipse。

答案 2 :(得分:9)

检查您的AndroidManifest.xml文件,查看包名是否正确。如果您复制了一个示例,那么这可能是错误的,也是问题的根源。

答案 3 :(得分:5)

我遇到了同样的问题。我没有任何说明“import something.R”的行。清洁和重建也没有解决问题。

原来是因为布局xml文件的名称。这些文件只能包含小写字母,数字或下划线。当我将文件名(以及引用它的所有内容)从myLayout.xml更改为my_layout.xml时,一切正常。

答案 4 :(得分:4)

  1. 检查res文件夹中的文件是否有任何错误
  2. 右键点击项目 - &gt; Android工具 - &gt;修复项目属性
  3. 项目清洁

答案 5 :(得分:4)

我刚遇到这个问题。

这是因为我有一个冗余的菜单资源,它引用了一个不存在的字符串。

删除菜单XML并返回R。

答案 6 :(得分:4)

在您尝试其他任何操作之前,请检查您的AndroidManifest.xml文件中的包声明是否与项目的src文件夹中的实际包名称相匹配!在创建我从现有项目复制的测试项目时,这对我造成了多次此错误。希望这能节省您的时间!

此外,使用任何大写字母创建XML文件都会触发此错误。

答案 7 :(得分:2)

如果R缺失

  • 找到您的R.java文件,它应该在./gen /
  • 文件夹中
  • 如果它丢失,并且“构建项目”没有构建它,那么你的一个 XML文件有错误,修复它们甚至删除它们,然后右键单击 您的项目并单击构建项目
  • 应生成R.java文件

答案 8 :(得分:2)

检查AndroidManifest.xml文件中的包名是否与java类的包名相同。

EG。 AndroidManifest.xml

 package="com.example.de.vogella.android.widget.example"

在你的班级MyWidgetProvider.java

package com.example.de.vogella.android.widget.example;

在这个例子中,这是我错误的原因。

答案 9 :(得分:1)

上面没有提到的任何内容对我有用。 但是,我自己修理了它。

解决方案:

如果除activity_main.xml内的main.xml / app_name/res/layout以外的任何其他文件,请将其删除并尝试清理并构建。

注意:

app_name/res/layout内的不需要的文件或(稍后使用的)文件将是*.out.xml。删除它。

答案 10 :(得分:1)

如果Clean / Rebuild Project不起作用,请尝试在AndroidManifest.xml中检查我们的包名称。

当您在AndroidManifest.xml文件中更改包名称时,会出现“无法解析R”的问题。它使用您的Android软件包名称在“gen”目录下创建一个子目录,用于存储R.java文件。

答案 11 :(得分:1)

我遇到了这个问题,结果发现这是因为我刚刚更改了一个布局xml文件中的错误

答案 12 :(得分:1)

以上所有建议都应该正常工作,如果您仍然面临问题我怀疑您使用的是64位操作系统且ADT正在寻找32位二进制文​​件

尝试在终端执行以下命令并清理项目一次

sudo apt-get install ia32-libs

答案 13 :(得分:1)

只需查看您的头文件即可:

import somefile.R;

只需删除该行即可。

答案 14 :(得分:1)

我刚刚在我的第一个hello world android应用程序中遇到此错误(2013年11月3日)。

除了其他用户的一些指示外,这就是我必须做的事情:

控制+ SHIFT + O

从主要活动.java文件的顶部删除导入 * .R

保存文件,清理并编译项目(通常是自动构建)

运行SDK Manager,如果尚未选中,则启用构建工具,然后点击Update,无论

关闭并重新打开Eclipse,问题就消失了

答案 15 :(得分:0)

我遇到了同样的问题,并且没有重新生成R.java的主要原因是项目中任何文件中的错误。一旦我们修复了那些,就应该生成R.java。

答案 16 :(得分:0)

我遇到了同样的问题。 我通过删除'gen'目录中的文件来修复它,然后我清理项目然后自动生成R.java。

答案 17 :(得分:0)

简单解决方案:

检查项目包下的gen [生成的Java文件]中是否有R.java文件。

如果不是,

  1. 您添加或修改的xml文件中存在一些错误。深入研究。修复所有黄色lint并浏览错误日志和控制台
  2. 检查你的xml文件应该是小写字母,&#39; _&#39;和数字。
  3. 检查您添加的图片名称也应该是小写字母,&#39; _&#39;和数字。
  4. 清理项目。
  5. 检查R.java是否已创建。如果是,但仍然发生错误,请按照下面的是说明,否则再次检查xmls
  6. 如果是,

    1. 替换&#39;导入android.R&#39;由您的项目包.R ex:&#39; com.mysmallapp.main.R&#39;在所有文件中。
    2. 清理项目

答案 18 :(得分:0)

我是Android开发的新手。我有同样的问题,并围绕这个线程旋转了大约一个星期。事实证明,当您下载最近发布的最新Android SDK(如API 23)时,或者如果您更新构建工具,如果没有更新,则需要在Gradle Scripts下修改build.gradle文件。它位于Project目录的app文件夹中。您可以使用记事本打开此文件。我的文件现在看起来像这样。

    apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.0"

    defaultConfig {
        applicationId "com.example.sukhwinder.justjava"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:23.+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

确保 compileSdkVersion buildToolsVersion targetSdkVersion 与您计算机上安装的最新版Android SDK和Build Tools相匹配。

答案 19 :(得分:0)

我已经看到许多答案建议“修复XML文件中的错误”,但只提供有关如何修复XML的一般提示和提示。

以下是查找XML错误的系统方法:

查看Eclipse中的“Problems”选项卡。忽略所有“R无法解析为变量”。看看还剩下什么。对我来说,它看起来像这样:

Unparsed aapt error(s)! Check the console for output.

我引用http://developer.android.com/tools/building/index.html#detailed-build

  

Android资产包装工具(aapt)会接收您的应用程序   资源文件,例如AndroidManifest.xml文件和XML文件   为您的活动,并编译它们。还生产了R.java   您可以从Java代码中引用您的资源。

现在,打开“控制台”标签。窗口 - &gt;显示视图&gt;控制台

这应该显示确切的错误,发生的文件以及行号:

[2014-05-13 08:27:05 - MyFirstApp] /Users/alain/code/experimental/android/adt_workspace4.4/MyFirstApp/res/menu/main_activity_actions.xml:4: error: Error: No resource found that matches the given name (at 'icon' with value '@drawable/ic_action_search').
[2014-05-13 08:27:05 - MyFirstApp] /Users/alain/code/experimental/android/adt_workspace4.4/MyFirstApp/res/menu/main_activity_actions.xml:4: error: Error: No resource found that matches the given name (at 'title' with value '@string/action_search').

在我的情况下,第一个错误是因为我引用ic_action_search但我还没有将ic_action_search.png放在res / drawable- * dpi目录中。 第二个错误是因为我引用了一个字符串“action_search”但我还没有在res / values / strings.xml中定义它

如果您点击控制台输出中的错误,ADT插件实际上会将您带到错误所在的行和文件,那将是很好的,但是现在,您必须手动执行此操作。

Eclipse的问题在于,当aapt失败时,并没有停止构建,而是继续到构建的下一个阶段,即Java编译器。命令行工具没有此问题:

生成build.xml:

$ android list targets

对我来说,我有:

Available Android targets:
----------
id: 1 or "android-16"
     Name: Android 4.1.2
     Type: Platform
     API level: 16
     Revision: 4
     Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in
 Tag/ABIs : default/armeabi-v7a, default/mips, default/x86
----------
id: 2 or "android-19"
     Name: Android 4.4.2
     Type: Platform
     API level: 19
     Revision: 3
     Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in
 Tag/ABIs : default/armeabi-v7a

从上面的列表中选择您的目标,并在下一个命令中使用它:

$ android update project --target <your_target_id> --path /path/to/android/project

现在生成了build.xml,您可以使用以下方法之一构建项目:

$ ant debug
$ ant -verbose debug
$ ant -debug debug

如果构建在aapt阶段失败,它正确地不会生成R.java,但它也正确地不会继续到Java Compiler阶段。控制台输出将向您显示(就像在Eclipse控制台视图中一样)XML错误所在的文件名和行号。

以下是如何打开Eclipse中的行号:

http://www.mkyong.com/eclipse/how-to-display-line-numbers-in-eclipse/

Preferences -> General -> Editors -> Text Editors -> [x] Show line numbers

答案 20 :(得分:0)

我和这个问题共存了2个星期,今天我发现解决方案是“icrease( MINIMUM SDK必需)到最大可能”

答案 21 :(得分:0)

Sooo许多不同的解决方案! 对我来说,我发现Eclipse在错误的包中创建了错误的文件。我通过将它移动到与R.java文件相同的包中来修复它。

答案 22 :(得分:0)

提示:一次更新SDK和所有实用程序。这对我有帮助。

答案 23 :(得分:0)

此错误是因为从项目R.java文件夹中删除了/gen文件。如果您有项目备份,请转到项目目录并粘贴您从备份部分复制的R.java文件。

损坏的R.java文件也可能是由XML中的错误引起的。这些错误通常不会出现在eclipse中,因此我建议您查看XML文件。之后,您还可以转到菜单栏中的Clean来尝试Project -> Clean...您的项目。

答案 24 :(得分:0)

如果您还没有,请尝试按照建议清洁项目。在Eclipse Indigo中,这是Project - &gt;干净...... - &gt; (确保检查您的项目) - &gt;好。之后,右键单击您的项目并选择“刷新”。

如果这仍然是一个问题,那么几个问题:

  1. 您最近是否在AndroidManifest.xml中更改了应用程序的软件包名称?
  2. AndroidManifest.xml中描述“转换”类的“活动”节点是否指定了一个无法与应用程序自然解决的包/名称?例如,如果您的应用程序是com.foo.bar并且您的活动被描述为com.foobar.Convert,则R. *将不会自动运行 - 您需要明确地将R包含在正确的包中。

答案 25 :(得分:0)

  • 重建
  • 清洁(菜单 - &gt;项目 - &gt;清洁)
  • 删除您的import de.vogella.android.temprature1.R;

答案 26 :(得分:-1)

我在FlashBuilder 4.7中执行我的项目,它在strings.xml中排成一行:

&lt; string name =“action_settings”&gt;设置&lt; / string&gt;

一旦我删除它,我得到了同样的错误。当它返回时,每个人都会再次工作。

答案 27 :(得分:-1)

对我来说是什么......

当我检查我的项目属性文件(/project_root/project.properties)时,它引用了我已经不再安装的旧版Android目标

# Project target.
target=android-15

一旦我将其更改为17,它就完美地工作了,文件保存后我的gen文件夹就被构建并充气了。

# Project target.
target=android-17

答案 28 :(得分:-2)

import com.de.vogella.android.temprature1.R;