私のプログラムでは、いくつかの画像でグリッドビューを使用しています。グリッドビューで画像をタップしたときにメニューを表示し、表示されたメニューから実行するアクションを選択します。
これが私のコードです:
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'
問題はどこだ?ありがとうございました
onClick
のButton
の(Dialog
のレイアウトから)のFragment
コールバックを(Android:onClick
を使用して)登録することはできません。 Androidは検索するため、それを見つけられませんonlyActivity
その名前に一致するメソッド(Btn_pumpInfo_Clicked
)とそのため代わりにButton
でDialog
を探し、通常のリスナーを割り当てます。
//...
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
クラス内にある場合。
このバグがAndroid 2.xでのみ発生している場合Android 4特定のクラスメンバーについて、アクティビティクラス階層を確認します。
public class HomeActivity extends Activity {
private Android.app.ActionBar.LayoutParams customTitleParams;
....
}
クラス Android.app.ActionBar.LayoutParams
はAndroid 2.xでは利用できません。これは問題を引き起こす可能性があります。
これは、View(Button)のonClickで呼び出すメソッドにアクセスできないか、それぞれのアクティビティで使用できない場合にも発生する可能性があります。確認する手順: