2015-03-26 11 views
9

To jest mój pierwszy raz, pracując z recyclerview i otrzymuję kilka błędów o android:onClick="addItem" o to, co dostaję, gdy próbuję dodać linię tekstu do mojego recyclerview. Zwykle używam mojego telefonu do testowania moich aplikacji.android java onClick Nie można wykonać metody działania

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) 

Tu jest mój kodu, gdzie moim zdaniem jest błąd, ale nie wiem dokładnie:

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); 
    } 
} 

}

I tu jest mój adapter recyclerview wiedzieć na pewno:

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); 
    } 
} 

Mój plik główną działalność xml:

<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> 

Może to moja ViewHolder:

public class RecyclerViewHolder extends RecyclerView.ViewHolder { 

    public TextView title; 

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

Albo Data.java klasa:

public class Data { 

     public String text; 
     public Data(String text) { 
      this.text = text; 
     } 
    } 
+0

'Spowodowany przez: java.lang.NullPointerException: Próba wywołania metody wirtualne„android.text.Editable android.widget.EditText.getText()” na odwołaniu do obiektu zerowego "Czy którykolwiek z tych komunikatów o błędach jest mylący? – Kon

+0

co mogę z tym zrobić? Nie jestem profesjonalistą w debugowaniu;) – svenvdz

+0

Ten wiersz 'at com.sapps.app.testapp2.MainActivity.addItem (MainActivity.java:53)' mówi ci ** dokładnie ** gdzie wyjątek jest ... upewnij się, że twój obiekt nie ma wartości NULL. To całkiem proste. Oznacza to również, że wiersz 'EditText mText = (EditText) findViewById (R.id.textEt);' nie jest wykonywany przed naciśnięciem przycisku i ten kod jest wywoływany. Ponieważ nie uwzględniłeś wcześniej tego, trudno będzie powiedzieć. –

Odpowiedz

5

otrzymujesz zerowy wskaźnik na getText() rozmowy

Oznacza to następujący wiersz :

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

zwraca zero, rozwiązaniem jest sprawdzenie i poprawienie układu, aby był na nim textEt.

Edit:

Jeżeli jesteś pewien, że to jest w układzie usunąć EditText deklarację.

Declare jako private EditText mText; zakresu klasy

setContentView(R.layout.name_of_layout_here); 
mText = (EditText) findViewById(R.id.textEt); 
+1

textEt jest już w moim pliku mainactivity.xml: ' ' – svenvdz

+0

@svenvdz, więc oznacza to, że masz kolejną publiczną zmienną, która powoduje, że" EditText mText "jest zadeklarowany w innym zakresie. musisz pokazać więcej kodu – meda

3

Klucz jest w swojej komunikat o błędzie:

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) 

Dobra wskazówka do nauki z wyjściem błędu jest, aby spojrzeć na siebie „Spowodowane przez "i przejrzyj dziennik, aż znajdziesz jeden z twoich własnych plików. Następnie ta część dziennika błędów powie Ci nawet, w której linii wystąpił błąd (w tym przypadku jest to linia 53 w MainActivity.java).

Wyjątkiem zerowego wskaźnika w Javie jest próba wywołania metody na obiekcie "A", ale ten obiekt "A" jest obecnie null.

Tak więc ten komunikat o błędzie oznacza: "W linii 53 programu MainActivity.java próbowano wywołać metodę na obiekcie, który jeszcze nie istnieje, dlatego uległa awarii."

Metoda że zawodzi jest EditText mText = (EditText) findViewById(R.id.textEt);

Zazwyczaj tego typu awarii oznacza, że ​​nie jest znalezienie odpowiedniego identyfikatora ze swojego układu. Kliknij dwukrotnie, czy textEt jest poprawnym identyfikatorem tego elementu układu.

EDIT:

nie

Wciąż pewny dlaczego twoje poglądy nie są coraz zaludniony, ale zauważyłem błąd z adaptera. Zmieniasz definicję mAdapter, więc masz 2 kopie, jedną w zasięgu lokalnym, a drugą w ramach MainActivity. To zdecydowanie zepsuje sytuację.

Prawy tutaj:

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

Jesteś redefinicji mAdapter lokalnie. Zrób to zamiast tego:

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

Mam już android: id = "@ + id/textEt" w pliku MainActivity.xml. Ale czy to możliwe, że mój LinearLayout powoduje błąd? – svenvdz

+0

Możesz umieścić punkt przerwania w linii 53 MainActivity.java. Kliknij dwukrotnie lewą stronę pliku w "rynnie" i pojawi się mała czerwona kropka. Zamiast nacisnąć przycisk odtwarzania, naciśnij przycisk błędu. Kiedy twój kod dotrze do tej linii, przestanie działać. Następnie możesz sprawdzić wartości całego układu i zobaczyć, co jest puste, a co nie. –

+0

Otrzymuję dużo = zero; – svenvdz

0

Widok w addItem(View v) odnosi się tylko do przycisku. Obiekt, którego chcesz nie ma w przycisku, znajduje się w widoku nadrzędnym przycisku. Jeśli spróbujesz uzyskać dostęp do obiektu z widoku przycisku, będzie on pusty, ponieważ przycisk go nie ma. Zamiast tego należy uzyskać dostęp do obiektu z widoku nadrzędnego przycisku.

Wiem, że technicznie to nie rozwiązuje kodu w pytaniu. Ale kod w pytaniu został zmieniony z tego, co spowodowało błąd, więc rozwiązałoby to pierwotny kod błędu, który faktycznie wywołał to pytanie. Jestem zgadywania, że ​​oryginalny kod buggy wyglądał następująco:

// 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> 
Powiązane problemy