wake-up-neo.com

android Java onClick Methode der Aktivität konnte nicht ausgeführt werden

Dies ist das erste Mal, dass ich mit der Recyclingübersicht arbeite. Ich bekomme einige Fehler bezüglich Android:onClick="addItem". Folgendes bekomme ich, wenn ich versuche, meiner Recyclingübersicht eine Textzeile hinzuzufügen. Normalerweise benutze ich mein Handy, um meine Apps zu testen.

Java.lang.IllegalStateException: Could not execute method of the activity
            at Android.view.View$1.onClick(View.Java:4012)
            at Android.view.View.performClick(View.Java:4761)
            at Android.view.View$PerformClick.run(View.Java:19767)
            at Android.os.Handler.handleCallback(Handler.Java:739)
            at Android.os.Handler.dispatchMessage(Handler.Java:95)
            at Android.os.Looper.loop(Looper.Java:135)
            at Android.app.ActivityThread.main(ActivityThread.Java:5312)
            at Java.lang.reflect.Method.invoke(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:372)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:901)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:696)
     Caused by: Java.lang.reflect.InvocationTargetException
            at Java.lang.reflect.Method.invoke(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:372)
            at Android.view.View$1.onClick(View.Java:4007)
            at Android.view.View.performClick(View.Java:4761)
            at Android.view.View$PerformClick.run(View.Java:19767)
            at Android.os.Handler.handleCallback(Handler.Java:739)
            at Android.os.Handler.dispatchMessage(Handler.Java:95)
            at Android.os.Looper.loop(Looper.Java:135)
            at Android.app.ActivityThread.main(ActivityThread.Java:5312)
            at Java.lang.reflect.Method.invoke(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:372)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:901)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:696)
     Caused by: Java.lang.NullPointerException: Attempt to invoke virtual method 'Android.text.Editable Android.widget.EditText.getText()' on a null object reference
            at com.sapps.app.testapp2.MainActivity.addItem(MainActivity.Java:53)
            at Java.lang.reflect.Method.invoke(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:372)
            at Android.view.View$1.onClick(View.Java:4007)
            at Android.view.View.performClick(View.Java:4761)
            at Android.view.View$PerformClick.run(View.Java:19767)
            at Android.os.Handler.handleCallback(Handler.Java:739)
            at Android.os.Handler.dispatchMessage(Handler.Java:95)
            at Android.os.Looper.loop(Looper.Java:135)
            at Android.app.ActivityThread.main(ActivityThread.Java:5312)
            at Java.lang.reflect.Method.invoke(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:372)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:901)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:696)

Hier ist mein Code, wo ich denke, ist der Fehler, aber ich weiß es nicht genau:

 public class MainActivity extends ActionBarActivity {

private EditText mText;
private RecyclerView.LayoutManager mLayoutManager;
private RecyclerView recyclerView;
private Button btn;
private CustomRecyclerAdapter mAdapter;

private List<Data> mData = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Initializing views.
    mText = (EditText) findViewById(R.id.textEt);
    recyclerView = (RecyclerView) findViewById(R.id.recycler);

    // If the size of views will not change as the data changes.
    recyclerView.setHasFixedSize(true);

    // Setting the LayoutManager.
    mLayoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(mLayoutManager);

    // Setting the adapter.
    CustomRecyclerAdapter mAdapter = new CustomRecyclerAdapter();
    recyclerView.setAdapter(mAdapter);
}



// Called when add button is clicked.
public void addItem(View v) {

    if(mText!=null) {
        Data dataToAdd = new Data(mText.getText().toString()); mData.add(dataToAdd);
    }
}

}

Und hier ist mein Recyclerview-Adapter, um sicher zu wissen:

public class CustomRecyclerAdapter extends RecyclerView.Adapter<RecyclerViewHolder> {

    CustomRecyclerAdapter mAdapter;

    private List<Data> mData = Collections.emptyList();

    public CustomRecyclerAdapter() {
        // Pass context or other static stuff that will be needed.
    }

    public void updateList(List<Data> data) {
        mData = data;
        notifyDataSetChanged();
    }
    @Override
    public int getItemCount() {
        return mData.size();
    }

    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) {
        LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
        View itemView = inflater.inflate(R.layout.list_item, viewGroup, false);
        return new RecyclerViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(RecyclerViewHolder viewHolder, int position) {
        viewHolder.title.setText(mData.get(position).text);
    }

    public void addItemInRec(int position, Data data) {
        mData.add(data);
        notifyItemInserted(position);
    }

    public void removeItem(int position) {
        mData.remove(position);
        notifyItemRemoved(position);
    }
}

Meine MainActivity-XML-Datei:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:orientation="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context=".MainActivity">

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

        <EditText
            Android:id="@+id/textEt"
            Android:layout_width="0dp"
            Android:layout_height="wrap_content"
            Android:layout_weight="1"
            Android:hint="Text"/>

        <Button
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="Add"
            Android:onClick="addItem"/>

    </LinearLayout>

    <Android.support.v7.widget.RecyclerView
        Android:id="@+id/recycler"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:scrollbars="vertical"/>

</LinearLayout>

Vielleicht ist es mein ViewHolder:

public class RecyclerViewHolder extends RecyclerView.ViewHolder {

    public TextView title;

    public RecyclerViewHolder(View itemView) {
        super(itemView);
        title = (TextView) itemView.findViewById(R.id.title);
    }
}

Oder Data.Java-Klasse:

public class Data {

        public String text;
        public Data(String text) {
            this.text = text;
        }
    }
14
svenvdz

Sie erhalten einen Nullzeiger beim Aufruf von getText() 

Es bedeutet die folgende Zeile:

EditText mText = (EditText) findViewById(R.id.textEt);

gibt null zurück, Lösung soll das Layout überprüfen und korrigieren, so dass textEt darauf steht.

Bearbeiten:

Wenn Sie sicher sind, dass es sich im Layout befindet, entfernen Sie die EditText-Deklaration.

Deklarieren Sie im Klassenbereich als private EditText mText;

setContentView(R.layout.name_of_layout_here);
mText = (EditText) findViewById(R.id.textEt);
5
meda

Der Schlüssel ist in Ihrer Fehlermeldung:

Caused by: Java.lang.NullPointerException: Attempt to invoke virtual method 'Android.text.Editable Android.widget.EditText.getText()' on a null object reference
            at com.sapps.app.testapp2.MainActivity.addItem(MainActivity.Java:53)

Ein guter Tipp, um aus der Fehlerausgabe zu lernen, ist es, sich jede "Caused by" -Anweisung anzusehen und das Protokoll zu durchsuchen, bis Sie eine eigene Datei gefunden haben, auf die verwiesen wird. In diesem Teil des Fehlerprotokolls erfahren Sie sogar, in welcher Zeile Ihr Code fehlgeschlagen ist (in diesem Fall handelt es sich um Zeile 53 in MainActivity.Java).

Eine Null-Zeiger-Ausnahme in Java tritt auf, wenn Sie versuchen, eine Methode für ein Objekt 'A' aufzurufen, das Objekt 'A' jedoch derzeit null ist.

Diese Fehlermeldung bedeutet also: "In Zeile 53 von MainActivity.Java haben Sie versucht, eine Methode für ein Objekt aufzurufen, das noch nicht vorhanden ist, also bin ich abgestürzt."

Die Methode, die fehlschlägt, ist EditText mText = (EditText) findViewById(R.id.textEt);

Normalerweise bedeutet diese Art von Fehler, dass Sie in Ihrem Layout nicht die richtige ID finden. Vergewissern Sie sich, dass textEt die richtige ID für dieses Layoutelement ist.

BEARBEITEN:

Sie sind immer noch nicht sicher, warum Ihre Ansichten nicht gefüllt werden, aber ich habe einen Fehler mit Ihrem Adapter festgestellt. Sie definieren mAdapter neu. Sie haben also 2 Kopien, eine im lokalen Geltungsbereich und eine als Mitglied von MainActivity. Dies wird definitiv die Dinge durcheinander bringen.

Genau hier:

// Setting the adapter.
CustomRecyclerAdapter mAdapter = new CustomRecyclerAdapter();
recyclerView.setAdapter(mAdapter)

Sie definieren mAdapter lokal neu. Tun Sie dies stattdessen:

// Setting the adapter.
mAdapter = new CustomRecyclerAdapter();
recyclerView.setAdapter(mAdapter)
3
Kio Krofovitch

Die Ansicht in addItem(View v) bezieht sich nur auf die Schaltfläche . Das gewünschte EditText-Objekt befindet sich nicht in der Schaltfläche, sondern in der übergeordneten Ansicht der Schaltfläche . Wenn Sie versuchen, auf das Objekt über die Schaltflächenansicht zuzugreifen, wird dies geschehen NULL sein, da die Schaltfläche es nicht hat. Sie müssen stattdessen auf das Objekt aus der übergeordneten Ansicht der Schaltfläche zugreifen.

// Solution:
public void addItem(View v) {
    View parentView = (View) v.getParent();
    EditText mText = (EditText) parentView.findViewById(R.id.textEt);
    Log.d("LOG", mText.getText().toString()));
}

Ich weiß, dass dies technisch den Code in der Frage nicht löst. Der Code in der Frage wurde jedoch von der Ursache des Fehlers geändert, sodass der ursprüngliche fehlerhafte Code, durch den die Frage tatsächlich erzeugt wurde, behoben wurde .. Ich vermute, dass der ursprüngliche fehlerhafte Code folgendermaßen aussah:

// My guess this was the original buggy code
// MainActivity.Java
public void addItem(View v) {
    EditText mText = (EditText) v.findViewById(R.id.textEt);
    Data dataToAdd = new Data(mText.getText().toString());
    mData.add(dataToAdd);
}

// MainActivity.xml
<LinearLayout>
    <EditText
        Android:id="@+id/textEt"
    />

    <Button
        Android:text="Add"
        Android:onClick="addItem"/>
</LinearLayout>
0
hexicle

Ändern Sie public void addItemInRec in public void addItem. Es gibt keine Methode für onClick in mainActivity.

0
Swapnil Acharya