findViewById(R.id.activity_main) - >无法解析符号' activity_main'

时间:2018-06-05 23:52:38

标签: java android xml

!!请注意!! 在调用setContentView()方法时不会发生错误。在搜索答案的过程中,我发现有人在这里发布了完全相同的问题(完全相同的代码可能与完全相同的教程源和所有内容),但它被标记为重复并错误地指向一个帖子,其中问题是不匹配类型在setContentView()方法而不是findViewByID(),解决方案是改变" R.id.activity_main" to" R.layout.activity_main",但这不是这里的情况。为了记录,我尝试了,但它只是将错误信息更改为"嘿,这需要是' id'"!

===问题===
目前我的代码中只有2个错误都指向不同方法中的相同语句 RelativeLayout bgElement = findViewById(R.id.activity_main);
其中activity_main为红色且带有消息"无法解析符号' activity_main'""
清理和重建编译错误时:错误:
cannot find symbol variable activity_main

这是我的第一个Android编程项目,我也从未使用过xml,所以请慢谈并使用小字。大声笑

===研究/擅自修复===
1)导入android.R从未出现在我的代码中 2)清洁和重建不能解决问题。 (每次尝试修理后我都会清理并重建)
3)以下示例代码在Android Studio警告的方法调用前面进行了类型转换,因此我删除了它。然后有一篇文章建议铸造是必要的,所以我尝试将其添加回来。当铸件存在而不存在时,错误仍然存​​在。
4)有人说在重建之前尝试删除R文件,但是没有R.java,他们说这是 - 也许它指的是旧版Android Studio?

=== JAVA CODE ===

package com.example.app1redbluelight;

import android.support.v7.app.AppCompatActivity;
import android.widget.RelativeLayout;
import android.widget.Button;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RelativeLayout bgElement = /*(RelativeLayout)*/findViewById(R.id.activity_main);
        bgElement.setBackgroundColor(Color.WHITE);
        myButtonListenerMethod();
    }

    public void myButtonListenerMethod() {
        button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                RelativeLayout bgElement = /*(RelativeLayout)*/findViewById(R.id.activity_main);
                int color = ((ColorDrawable) bgElement.getBackground()).getColor();
                if (color == Color.RED)
                    bgElement.setBackgroundColor(Color.BLUE);
                else
                    bgElement.setBackgroundColor(Color.RED);
            }
        });
    }
}

=== XML文件===

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="148dp"
        android:layout_marginStart="148dp"
        android:text="Button"
        app:layout_constraintStart_toStartOf="parent"
        tools:layout_editor_absoluteY="231dp" />
</android.support.constraint.ConstraintLayout>

4 个答案:

答案 0 :(得分:2)

在Android中,该功能 findViewById()会返回与该布局中的ID对应的视图。
在您的代码中, setContentView(R.layout.activity_main); 设置主要活动的布局。
此时,findViewById()在activity_main布局中查找视图 因此无法解析activity_main布局中的“activity_main” 如果您需要获取activity_main的布局,请尝试以下操作。

 LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
  ConstraintLayout bgElement = (ConstraintLayout)inflater.inflate(R.layout.activity_main, null);

如果需要在activity_main.xml中获取布局,则需要设置布局的ID。 ( android:id =“@ + id / activity_main”必须添加。)
请参阅以下内容。

<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id = "@+id/activity_main"
tools:context=".MainActivity">

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="148dp"
    android:layout_marginStart="148dp"
    android:text="Button"
    app:layout_constraintStart_toStartOf="parent"
    tools:layout_editor_absoluteY="231dp" />
</android.support.constraint.ConstraintLayout>

答案 1 :(得分:1)

您正在尝试查找xml文件中不存在的布局:

RelativeLayout bgElement = /*(RelativeLayout)*/findViewById(R.id.activity_main);

xml文件中的任何元素都没有id“activity_main”,你的xml中也没有RelativeLayout。

大多数情况下,错误来自缺少id设置为activity_main的元素。

我想你想要改变整个屏幕的背景颜色,所以在ConstraintLayout中添加一个id:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/activity_main"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="148dp"
        android:layout_marginStart="148dp"
        android:text="Button"
        app:layout_constraintStart_toStartOf="parent"
        tools:layout_editor_absoluteY="231dp" />
</android.support.constraint.ConstraintLayout>

然后更改代码以使用它:

ConstraintLayout bgElement = /*(ConstraintLayout)*/findViewById(R.id.activity_main);

答案 2 :(得分:0)

问题是由这些原因造成的 1 :没有名为&#34; activity_main&#34;在附加的xml中    findViewbyId()在该xml文件中查找View,因为您将activity_main.xml设置为MainActivity。
2 :xml内容中没有RelativeLayout项。

<强>修正
 尝试添加ID,&#34; activity_main&#34;到ConstraintLayout,
 或尝试使用LayoutInflator。

答案 3 :(得分:0)

发现以这种方式调用activity_main并不理想,并且由于约束布局而导致应用程序崩溃。

插入新的水平布局,然后引用该布局以更改背景颜色。 Android似乎不喜欢尝试以这种方式过多更改约束层的变量。

希望这会有所帮助