按钮为空对象引用(Android Studio) [英] Button is null object reference (Android Studio)

查看:26
本文介绍了按钮为空对象引用(Android Studio)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 recyclerview 和 view holder 来列出我所有来自 firestore 的数据.每个数据都会有一个删除按钮来删除.但是每当我将删除按钮放在 admin 类上时,它都会在空对象引用上显示 void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' .但是,如果我将删除按钮放在 view holder 类上,它会起作用.那么如何将删除按钮放在我的 admin class 上?

I have a recyclerview and view holder to list all my data from firestore. Each data will have a delete button to be deleted. But whenever I put the delete button on admin class, it show me void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference. But if i put delete button on view holder class it work. So how can i put the delete button on my admin class?

admin

package com.example.sossystem;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.firebase.ui.firestore.FirestoreRecyclerAdapter;
import com.firebase.ui.firestore.FirestoreRecyclerOptions;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.FirebaseFirestore;

import org.jetbrains.annotations.NotNull;
import org.w3c.dom.Text;

import java.util.ArrayList;

public class admin extends AppCompatActivity {
    Button  gotoRegister, deletebutton;
    FirebaseFirestore db =  FirebaseFirestore.getInstance();

    RecyclerView mFirestoreList;

    CollectionReference query = db.collection("Users");
    //recycler options
    FirestoreRecyclerOptions<SosRecords> options;
    FirestoreRecyclerAdapter<SosRecords,MyViewHolder>adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_admin);

        deletebutton = (Button)findViewById(R.id.delete_button);

        gotoRegister = findViewById(R.id.gotoRegister);
        mFirestoreList = findViewById(R.id.firestore_list);
        mFirestoreList.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        mFirestoreList.setHasFixedSize(true);



        //register button click event
        gotoRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(getApplicationContext(), RegisterOfficer.class));
            }
        });
        ReadData();

    }

    private void ReadData() {
    options = new FirestoreRecyclerOptions.Builder<SosRecords>().setQuery(query,SosRecords.class).build();
    adapter=new FirestoreRecyclerAdapter<SosRecords, MyViewHolder>(options) {
        @Override
        protected void onBindViewHolder(@NonNull @NotNull MyViewHolder holder, int position, @NonNull @NotNull SosRecords model) {

            holder.email.setText(model.getEmailAddress());
            holder.name.setText(model.getFullName());
            holder.phone.setText(model.getPhoneNumber());
            holder.position.setText(model.getPosition());

            deletebutton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    FirebaseFirestore db = FirebaseFirestore.getInstance();
                    DocumentReference noteRef = db.collection("Users").document(model.getFirebaseUid());
                    noteRef.delete().addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull @NotNull Task<Void> task) {
                            if(task.isSuccessful()){

                                Log.d("TAG","delete"+model.getFirebaseUid());
                            }
                            else{
                                Log.d("TAG","error");

                            }
                        }
                    });
                }
            });




        }



        @NonNull
        @NotNull
        @Override
        public MyViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
            View  view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_singleofficer,parent,false);
            return new MyViewHolder(view);
        }
    };

    adapter.startListening();
    mFirestoreList.setAdapter(adapter);

    }


    public void logoutAdmin(View view) {
        FirebaseAuth.getInstance().signOut();
        startActivity(new Intent(getApplicationContext(), Login.class));
        finish();
    }


}

Viewholder 类

Viewholder class

package com.example.sossystem;

import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QuerySnapshot;

import org.jetbrains.annotations.NotNull;

class MyViewHolder extends RecyclerView.ViewHolder {
    TextView name,phone,email,position;
    FirebaseAuth fAuth;
    FirebaseFirestore fStore;
    public MyViewHolder(@NonNull @NotNull View itemView) {
        super(itemView);
        //firebase auth instances assign
        fAuth = FirebaseAuth.getInstance();
        fStore = FirebaseFirestore.getInstance();
        name=itemView.findViewById(R.id.name_text);
        phone=itemView.findViewById(R.id.surname_text);
        email=itemView.findViewById(R.id.email_text);
        position=itemView.findViewById(R.id.position_text);

    }




}

单个项目的 XML

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="190dp"
    android:layout_margin="10dp"
    android:padding="20dp"
    app:cardCornerRadius="10dp"
    app:cardElevation="8dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">s

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="5dp"
                android:text="Email : "
                android:textSize="17sp"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/email_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="20dp"
                android:text="gasg"
                android:textSize="17sp"
                android:textStyle="bold" />

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="5dp"
                android:text="Name : "

                android:textSize="17sp"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/name_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="20dp"
                android:text="gasg"
                android:textSize="17sp"
                android:textStyle="bold" />


        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="5dp"
                android:text="Phone : "

                android:textSize="17sp"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/surname_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="20dp"
                android:text="ga"
                android:textSize="17sp"
                android:textStyle="bold" />

            <Button
                android:id="@+id/buttonCall"
                android:layout_width="wrap_content"
                android:layout_height="40dp"
                android:text="Call"
                android:translationX="70dp" />sg

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="5dp"
                android:text="Position : "

                android:textSize="17sp"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/position_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="20dp"
                android:text="ga"
                android:textSize="17sp"
                android:textStyle="bold" />



        </LinearLayout>

        <Button
            android:id="@+id/delete_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="delete"
            android:text="Delete Account"
            android:translationX="125dp"
            app:backgroundTint="#B84B4B" />


    </LinearLayout>

</androidx.cardview.widget.CardView>

推荐答案

在管理类中,您的删除按钮位于 onbindViewHolder 内,您需要将其写为

In Admin Class your delete button is inside onbindViewHolder you need to write it as

holder.deletebutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick (View v){
                //delete
            }
        });

这篇关于按钮为空对象引用(Android Studio)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆