首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >java.lang.illegalstateexception在活动类android片段中找不到方法(视图)

java.lang.illegalstateexception在活动类android片段中找不到方法(视图)
EN

Stack Overflow用户
提问于 2012-12-06 16:52:32
回答 3查看 30.2K关注 0票数 18

在我的程序中,我正在使用一个带有一些图像的网格视图,我想在用户点击网格视图中的图像时显示一个菜单,然后从显示的菜单中选择要执行的操作。

下面是我的代码:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
<?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>

当我使用这段代码时,出现了一个错误:

代码语言:javascript
复制
java.lang.RuntimeException: Unable to start activity ComponentInfo{Kazemi.Alireza.scada/Kazemi.Alireza.scada.MainMenu}: java.lang.NullPointerException

当我注释Btn_pumpInfo_Clicked()方法,并在onStart()中取消注释按钮侦听器时,发生了以下错误:

代码语言:javascript
复制
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'

问题出在哪里?谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-06 17:28:57

你不能在Dialog类中注册ButtononClick回调(使用android:onClick),因为安卓不会找到它,因为它只会在 Activity中搜索与该名称匹配的方法(Btn_pumpInfo_Clicked),并会抛出异常。取而代之的是在Dialog中查找Button并为其分配一个普通的侦听器:

代码语言:javascript
复制
//...
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
   }
});

或者移动该方法:

代码语言:javascript
复制
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类中,如果适合您的话。

票数 43
EN

Stack Overflow用户

发布于 2013-10-03 20:51:15

如果这个错误只发生在Android2.x上,请检查您的Activity类层次结构中特定于Android4的类成员:

代码语言:javascript
复制
public class HomeActivity extends Activity {

  private android.app.ActionBar.LayoutParams customTitleParams;

  ....
}

android.app.ActionBar.LayoutParams在Android2.x上不可用,这可能会导致问题。

票数 3
EN

Stack Overflow用户

发布于 2017-07-05 19:24:09

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

  • 检查android:onClick属性的值中的方法名称是否与实际编写的方法匹配。
  • 检查该方法的访问修饰符是否为公共,以便可供执行。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13739962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档