2012-12-06 19 views
16

我使用gridview和一些图像,当用户在gridview中点击一个图像时我想显示一个菜单,然后从显示的菜单中选择要执行的操作。在我的程序中,java.lang.illegalstateexception找不到活动类中的一个方法(视图)android fragment

这里是我的代码:

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

}

这里是我的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"/> 

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

当我使用此代码,发生错误:

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

,当我评论的Btn_pumpInfo_Clicked()方法,并且在调用onStart未注释的按钮侦听()以下错误发生:

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' 

问题出在哪里? 谢谢

+0

你应该张贴整个堆栈跟踪,而不仅仅是一行,并就在你的代码 – nandeesh

回答

39

你不能在Fragment类注册了ButtononClick回调(使用)(从Dialog的布局),因为Android将找不到它,因为它会搜索Activity为一个匹配该名称的方法(Btn_pumpInfo_Clicked),它会抛出该异常。相反查找ButtonDialog并为其分配一个普通听众:

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

或移动方式:

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

Activity类,如果它适合你。

+1

指出的行号@ user1793700如果我的回答帮助,你可以将其标记为正确的(有复选标记),这样的问题会成为回答。我不知道你使用的两个选项中的哪一个,如果你打算使用'Dialog'类,那么你最好让自己的对话框扩展'Dialog',并在该类中设置内容视图并设置监听器。 – Luksprog

+0

我不知道我可以如何标记为正确!你能解释我该怎么做吗?我用我的第一个选项,它适用于我:)感谢您的评论:) – user1793700

+0

我在我的代码中使用我自己的对话框,这不是真的吗? – user1793700

3

如果这个bug是在Android 2.x的只发生检查你的Activity类层次结构Android的4类特定成员:

public class HomeActivity extends Activity { 

    private android.app.ActionBar.LayoutParams customTitleParams; 

    .... 
} 

android.app.ActionBar.LayoutParams是不是可以在Android 2.x的,这可以导致问题。

+0

我有这个相同的问题,我想你可能已经击中了它的头。我想我可能会在姜饼上测试我的应用程序,但是,我的onClick(View v)在类android.support.v7.widget.AppCompatImageButton上崩溃,找不到它。 –

0

当调用onClick(按钮)onClick的方法在相应的活动中不可访问或不可用时,也会发生这种情况。 检查步骤:

  • 检查android的值的方法名称:onClick属性匹配实际编写的方法。
  • 检查该方法的访问修饰符是否公开,以便 执行。
相关问题