2012-12-06 5 views
16

w moim programie, używam gridview z niektórymi obrazami, chcę pokazać menu, gdy użytkownik stuknął na obrazie w widoku siatki, a następnie wybierz akcję do wykonania z pokazanego menu.java.lang.illegalstateexception nie mógł znaleźć metody (widoku) w elemencie androida klasy aktywności

tutaj jest moje kody:

package Kazemi.Alireza.scada; 
import android.annotation.SuppressLint; 
import android.app.Dialog; 
import android.app.FragmentManager; 
import android.content.Context; 
import android.graphics.Typeface; 
import android.graphics.drawable.AnimationDrawable; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.ContextMenu; 
import android.view.ContextMenu.ContextMenuInfo; 
import android.view.Gravity; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.WindowManager; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.AdapterView; 
import android.widget.AdapterView.AdapterContextMenuInfo; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.GridView; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.PopupWindow; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.widget.AdapterView.OnItemClickListener; 


@SuppressLint("NewApi") 
public class CitiesTab extends Fragment { 

AnimationDrawable[] frameAnimation; 
ImageAdapter ia; 
GridView gridView; 
int in; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return (LinearLayout)inflater.inflate(R.layout.citytab, container, false); 
} 

public void onStart() 
{ 
    super.onStart(); 
    ia = new ImageAdapter(getActivity()); 
    gridView = (GridView) getActivity().findViewById(R.id.gridview); 
    gridView.setAdapter(ia); 
    gridView.post(new Starter()); 
    gridView.setOnItemClickListener(new OnItemClickListener() 
    { 
     public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
     { 
      dialog = new Dialog(getActivity(), android.R.style.Theme_InputMethod); 
      dialog.setContentView(R.layout.pump_menu); 
     }}); 
    /*Button btn = (Button) getActivity().findViewById(R.id.Button_pumpInfo); 
    btn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Toast.makeText(getActivity(), "You clicked on Item 1", 
        Toast.LENGTH_LONG).show(); 
     } 
    });*/ 
} 

public void Btn_pumpInfo_Clicked(View v) { 
    // TODO Auto-generated method stub 
    Toast.makeText(getActivity(), "You clicked on Item 1", 
      Toast.LENGTH_LONG).show(); 
} 

}

Oto mój kod pump_menu.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#a5c5f0" 
    android:orientation="vertical" > 

<Button 
    android:id="@+id/Button_pumpInfo" 
    android:layout_height="40dp" 
    android:text="@string/menu_pumpinfo_item1" 
    android:textSize="11sp" 
    android:layout_width="125dp" 
    android:background="#a5c5f0" 
    android:onClick="Btn_pumpInfo_Clicked"/> 

i citytab.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

<GridView 
    android:id="@+id/gridview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:numColumns="auto_fit" 
    android:verticalSpacing="10dp" 
    android:horizontalSpacing="10dp" 
    android:columnWidth="90dp" 
    android:stretchMode="columnWidth" 
    android:gravity="center" /> 

<ImageView 
    android:id="@+id/gifViewer" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:scaleType="center"/> 

</LinearLayout> 

kiedy użyj tego kodu, wystąpił błąd:

java.lang.RuntimeException: Unable to start activity ComponentInfo{Kazemi.Alireza.scada/Kazemi.Alireza.scada.MainMenu}: java.lang.NullPointerException 

i kiedy komentować metodę Btn_pumpInfo_Clicked(), a Odkomentowano przycisk słuchacza w onStart() jest następujący błąd wystąpił:

java.lang.IllegalStateException: Could not find a method Btn_pumpInfo_Clicked(View) in the activity class android.view.ContextThemeWrapper for onClick handler on view class android.widget.Button with id 'Button_pumpInfo' 

gdzie jest problem? Thank You

+0

należy zakładać cały ślad stosu, a nie tylko jednej linii i nie wskazać numery linii w kodzie – nandeesh

Odpowiedz

39

Nie można zarejestrować zwrotnego onClick (używając) dla Button (z układu Dialog) w klasie Fragment ponieważ Android nie znajdzie go, ponieważ będzie ona szukać tylkoActivity dla metoda pasująca do tej nazwy (Btn_pumpInfo_Clicked) i spowoduje odrzucenie tego wyjątku. Zamiast szukać Button w Dialog i przypisać ją do normalnego słuchacza:

//... 
dialog.setContentView(R.layout.pump_menu) 
Button b = (Button) dialog.findViewById(R.id.Button_pumpInfo); 
b.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onCLick(View v) { 
     // profit 
    } 
}); 

Albo przenieść metodę:

public void Btn_pumpInfo_Clicked(View v) { 
    // TODO Auto-generated method stub 
    Toast.makeText(getActivity(), "You clicked on Item 1", 
      Toast.LENGTH_LONG).show(); 
} 

w klasie Activity czy pasuje do ciebie.

+1

@ user1793700 Jeżeli moja odpowiedź pomogła można oznaczyć jako poprawne (z haczykiem), więc pytanie będzie uzyskać odpowiedź. Nie wiem, której z dwóch opcji używałeś, jeśli zamierzasz używać klasy 'Dialog', wtedy lepiej utwórz własne okno dialogowe rozszerzające' Dialog' iw tej klasie ustaw widok zawartości i ustaw detektory. – Luksprog

+0

Nie wiem, jak mogę oznaczyć jako poprawne! czy możesz mi wyjaśnić, jak to zrobić? Użyłem pierwszej opcji w moim przypadku i działa to dla mnie :) dziękuję za komentarz :) – user1793700

+0

Używam mojego własnego okna dialogowego w moim kodzie, czy to prawda? – user1793700

3

Jeśli ten błąd się dzieje tylko na Android 2.x sprawdzić hierarchii klas aktywności dla Androida 4 konkretnych członków klasy:

public class HomeActivity extends Activity { 

    private android.app.ActionBar.LayoutParams customTitleParams; 

    .... 
} 

Klasa android.app.ActionBar.LayoutParams nie jest dostępna na Android 2.x i może powodować problem.

+0

Mam ten sam problem i myślę, że mógłbyś uderzyć go w głowę. Myślałem, że mogę przetestować moją aplikację na pierniku, ale mój onClick (View v) ulega awarii na klasie android.support.v7.widget.AppCompatImageButton, nie może go znaleźć. –

0

Może się to również zdarzyć, gdy metoda wywoływania onClick of the View (Button) jest niedostępna lub niedostępna w danym działaniu. Kroki do sprawdzenia:

  • sprawdzić nazwę metody wartości dla Androida: onClick atrybutu pasuje metoda rzeczywiście napisane.
  • Sprawdź, czy modyfikator dostępu do metody jest jawny, aby był dostępny dla wykonania .