为什么android:onClick无法识别指定的功能?

时间:2019-02-16 16:37:58

标签: android

Java代码:-

package com.example.plannerv1;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import org.w3c.dom.Text;

import java.util.ArrayList;

public class DisplayNotes extends AppCompatActivity {
    handledatabaseonhomescreen handle_db_notes = new handledatabaseonhomescreen();
    private int key;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_notes);
        Intent incomingintent = getIntent();
        key = incomingintent.getIntExtra("key",-1);
        displaydate(key);genanddisplay();
    }
    protected void addanote(View v)
    {
        Intent goback = new Intent();
        goback.putExtra("returnkey",-100);
        goback.putExtra("datewas",key);
        setResult(RESULT_OK,goback);
        finish();
    }

    protected void onActivityResult(int requestCode,int resultCode,Intent intent)
    {
        genanddisplay();
    }
}

XML代码:-

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:gravity="top|center"
    android:layout_height="match_parent"
    tools:context=".DisplayNotes"
    android:orientation="vertical">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="20sp"
        android:paddingBottom="20sp"
        android:textStyle="bold"
        android:gravity="center"
        android:textSize="20dp"
        android:id="@+id/dmy"/>

    <ListView
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:paddingTop="20sp"
        android:paddingBottom="20sp"
        android:paddingLeft="5sp"
        android:paddingRight="6sp"
        android:layout_weight="10"
        android:id="@+id/displaynote">
    </ListView>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="20sp"
        android:text="Add Note"
        android:onClick="addanote"/>
</LinearLayout>

错误:-

java.lang.IllegalStateException: Could not find method addanote(View) in a parent or ancestor Context for android:onClick attribute defined on view class androidx.appcompat.widget.AppCompatButton
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:424)
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:381)
    at android.view.View.performClick(View.java:5619)
    at android.view.View$PerformClick.run(View.java:22298)
    at android.os.Handler.handleCallback(Handler.java:754)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:165)
    at android.app.ActivityThread.main(ActivityThread.java:6375)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)

我不知道为什么onClick标记未将按钮附加到指定功能。

我尝试向Google搜索该问题,但没有任何帮助。我尝试更改名称并检查文件是否链接,但没有帮助。

对于该错误的难看格式,我感到抱歉,但是stackoverflow不允许我发布。

AndroidStudio发出此警告:-

Method 'addanote' in 'DisplayNotes' has incorrect signature less... (Ctrl+F1) 
Inspection info: Checks if the method specified in onClick XML attribute is declared in related activity

4 个答案:

答案 0 :(得分:3)

您的addanote()函数必须是public,而不是protected

public void addanote(View v)

文档:https://developer.android.com/guide/topics/ui/controls/button#java

答案 1 :(得分:0)

如@Marcin所述,您应该使用public而不是protected。另外,您可以使用其他但更好的方法,在Button上添加一个侦听器:

向Button添加一个id属性,然后在onCreate()方法中定义侦听器。
XML:

<Button
    android:id="addNote"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="20sp"
    android:text="Add Note"/>

然后是Java:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    Button addNote = findViewById(R.id.addNote);
    addNote.setOnClickListner(new View.OnClickListener() {
        @Override
        public void onClick() {
            //Your code to be implemented when button is clicked.
        }
    });
    ...
}

答案 2 :(得分:0)

“ MainActivity”活动具有一个具有相同名称和参数的函数,并且将“ addanote”更改为其他名称以某种方式解决了该问题。我不知道这会干扰“ DisplayNotes”活动。不过需要公开。

答案 3 :(得分:0)

您需要按此处所述将方法公开

https://developer.android.com/guide/topics/ui/controls/button#java

您在android:onClick属性中声明的方法必须具有完全如上所述的签名。具体来说,该方法必须: 公开 返回无效 将一个视图定义为其唯一参数(这将是被单击的视图)

代码公开后可以正常工作


enter image description here