无法解析R.id.toolbar

时间:2018-08-05 18:53:23

标签: android android-studio

我将按照this book中的示例将自己的脚步投入到Android开发中。但是,我无法使下面的示例正常工作。说明如下:1)名为Dialog的新项目2)空活动3)粘贴/编辑以类似于下面的代码。

消息是Studio无法解析: R.id.toolbar R.id.fab R.menu ,和 R.id.action_settings

我在macOS High Sierra上运行Android Studio 3.1.3。我最好的猜测是,说明缺少步骤,或者由于该书已有2年的历史,因此Android Studio更改了行为,导致该示例无法使用。我对这个开发过程还不够了解,甚至不知道如何开始对此进行诊断。

在AndroidManifest.xml中,将此行添加到活动块:

android:theme="@style/Theme.AppCompat.Dialog"

这是项目唯一要更改的代码文件(DialogActivity.java):

package com.example.sample.dialog;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

public class DialogActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dialog);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with an action",
                        Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_dialog, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

activity_dialog.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=".DialogActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

4 个答案:

答案 0 :(得分:2)

出现这些错误的原因是因为Java正在寻找尚未创建的XML引用。例如,它正在寻找从未创建的名为“ R.id.fab”的引用。

要解决此问题,您将必须进入res文件夹并创建必要的文件。在res-> layout->“ activity_dialog.xml”文件中,您必须创建一个FAB才能消除该错误。您可以复制/粘贴此代码。

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="16dp"/>

在这里,我用XML创建必要的View,并给它一个名为fab的ID,以便您可以在Java代码中引用它。您还需要创建菜单文件夹和文件,因此右键单击res文件夹,然后转到“新的Android资源文件”。将文件名设置为“菜单”,并且资源类型也应该是菜单。然后,当您单击“确定”时,将看到一个名为menu的新文件夹,并且在该文件夹的内部有一个名为“ menu.xml”的文件。 在该“ menu.xml”文件中,您将必须创建一个ID为“ action_settings”的菜单选项。您可以使用以下代码来做到这一点:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_settings" android:title="Settings"/>
</menu>

最后,您可以通过右键单击布局文件夹并选择新的布局资源文件来创建工具栏。您可以将其命名为“ toolbar”,并将根元素设置为android.support.v7.widget.Toolbar。这将为您生成适当的代码,您可以根据需要进行编辑。之后,返回“ activity_dialog.xml”文件并使用以下代码:

<include 
    android:id="@+id/toolbar"
    layout="@layout/toolbar" />

这应该消除所有4个错误

答案 1 :(得分:0)

您尚未从xml获得对该视图的引用。

例如,如果在xml中定义了一个ID为myBtn的按钮,则可以从xml中获取引用。我将获得的引用为Button button = findViewById(R.id.myBtn)。

答案 2 :(得分:0)

再次检查R.layout.activity_dialog文件中的ID。当在膨胀的布局中找不到所需的ID时,Android Studio将输出该消息。

编辑:

您的XML文件中没有声明工具栏。当您要搜索要在“片段”或“活动”中使用的布局元素时,请使用在XML文件中设置的id参数。如果忘记设置ID或使用错误的ID,它将告诉您符号无法解析。有太多项目要添加到您的代码中,但是请按照下面的链接进行操作,您将很快找到它。如果您需要更多信息,请与我们联系。另外,CodePath是我开始学习Android开发时非常依赖的出色资源。

请参阅this,以获取将工具栏添加到布局文件的教程,以及this,以获取更多其他信息。

答案 3 :(得分:0)

在主菜单上,选择“文件”。使高速缓存无效/重新启动。出现“ Invalidate Caches”消息,通知您缓存将失效并在下次启动时重建。使用对话框中的按钮可使缓存无效。