課題プログラムが強制終了

このQ&Aのポイント
  • Androidの学習をしている初心者が演習問題の課題プログラムを実行すると、has application stoppedというエラーが発生し、強制終了してしまいます。
  • NullPointerExceptionのエラーメッセージがlogcatに表示されており、ソースコードの変更に起因している可能性があります。
  • ビルドは通るが、実行時にコード中のregisterForContextMenu(txtMenuTouch)でNullPointerExceptionが発生しています。原因や解決策がわからず困っています。
回答を見る
  • ベストアンサー

課題プログラムが強制終了

現在Androidの学習をしている初心者です。 演習問題の課題プログラムが与えられており、それをこなしています。 ある演習問題でhas application stoppedとなってしまい、強制終了してしまいます。 ググったりしてみたのですが、解決の糸口になるような情報を得られませんでした。 logcatを見た結果、ソースの変更点でNullPointerExceptionが発生していました。 コード的に問題ない(ビルドは通る)ので対策がまったくもって分かりません。 お知恵を拝借したいのですが…。 以下に問題となったソースコードを張り付けておきます。 import android.app.Activity; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.view.ContextMenu.ContextMenuInfo; import android.widget.EditText; import android.widget.TextView; public class Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // コンテキストビューアクションの設定 EditText txtMenuTouch = (EditText) findViewById(R.id.sampleText); registerForContextMenu(txtMenuTouch); ←ここでNullPointer発生 // 画面描画 setContentView(R.layout.main); } // -- オプションメニュー関連 @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater iflater = getMenuInflater(); iflater.inflate(R.menu.optionmenu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { final String message; switch (item.getItemId()) { case R.id.opt_menu: message = "オプションメニューが選択されました!"; break; default: message = "その他(入らない)"; break; } TextView txtMenuTouch = (TextView) findViewById(R.id.showMenuTouch); txtMenuTouch.setText(message); return true; } // -- コンテキストメニューとサブメニュー関連 final static int CONTEXT_ITEM_ID1 = 1000; @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.setHeaderTitle("こんてきすとめにゅー"); menu.add(0, CONTEXT_ITEM_ID1, 0, "コンテキストメニュー!"); } @Override public boolean onContextItemSelected(MenuItem item) { final String message; switch (item.getItemId()) { case CONTEXT_ITEM_ID1: message = "こんてきすとめにゅーが指定されました!"; break; default: message = "その他(入らない)"; break; } TextView txtMenuTouch = (TextView) findViewById(R.id.showMenuTouch); txtMenuTouch.setText(message); return true; } // -- その他機能 public void exitButton_click(View view) { this.finish(); } よろしくお願いいたします。

  • Android
  • 回答数2
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • okgoripon
  • ベストアンサー率44% (1141/2550)
回答No.2

 読みなおしてみたら、ちょっと微妙だったので。  findViewById()メソッドはsetContentView()で設定されたビューを対象とするので、まだ1回もsetContentView()メソッドが実行されていない段階では対象となるビューが判らず、エラーとしてnullを返します。  XMLファイルが実体を持たないというのも間違いではありませんが、エラーの原因としてはこちらのほうが正しいはずなので、訂正させていただきます。

kagemarurx
質問者

お礼

回答ありがとうございます。 おっしゃる通りに変更したところ、エラーも出ず、正常に動作する様になりました。 画面描画が先だったんですね。 まだまだ勉強することがあります。

その他の回答 (1)

  • okgoripon
  • ベストアンサー率44% (1141/2550)
回答No.1

onCreate()メソッドの中身 super.onCreate(savedInstanceState); // コンテキストビューアクションの設定 EditText txtMenuTouch = (EditText) findViewById(R.id.sampleText); registerForContextMenu(txtMenuTouch); //←ここでNullPointer発生 // 画面描画 setContentView(R.layout.main); を super.onCreate(savedInstanceState); // 画面描画 setContentView(R.layout.main); // コンテキストビューアクションの設定 EditText txtMenuTouch = (EditText) findViewById(R.id.sampleText); registerForContextMenu(txtMenuTouch); と書き換え(順番を入れ替え)てください。 layoutフォルダに配置されているレイアウトのXMLファイル(この場合はmain.xml)は、setContentView()メソッドが呼ばれた時点でメモリ上に読み込まれて実体を持ちます。 それ以前にfindViewById()メソッドでビューを参照しようとすると実体がないのでエラーが起きnullが返されますので、結果としてregisterForContextMenu()メソッドにnullが渡されてNullPointerExceptionが発生します。 そういうことです。

関連するQ&A

  • androidアプリが強制終了してしまいます。

    オプションメニューボタンの「MENU_ITEM0」を押すと、他の機能が呼び出されずに強制終了でエラーになってしまいます。 ・呼び出すソースファイルです。 「public class CogoterActivity extends Activity { //メニューアイテムID private static final int MENU_ITEM0=0, MENU_ITEM1=1; //アクティビティ起動時に呼ばれる @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); requestWindowFeature(Window.FEATURE_NO_TITLE); //リスト要素の情報群の生成 List<ListItem> items=new ArrayList<ListItem>(); for (int i=0;i<50;i++) { items.add(new ListItem(res2bmp(this,R.drawable.icon),"項目"+i)); } //リストビューの設定 ListView listView=new ListView(this); listView.setScrollingCacheEnabled(false); listView.setAdapter(new ListAdapter(this,items)); setContentView(listView); new TextView(this); } public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); //メニューアイテム0の追加 MenuItem item0=menu.add(0,MENU_ITEM0,0,"ぶつぶつ"); item0.setIcon(android.R.drawable.ic_menu_edit); //メニューアイテム1の追加 MenuItem item1=menu.add(0,MENU_ITEM1,0,"ぶくぶく"); item1.setIcon(android.R.drawable.ic_menu_more); return true; } //メニューアイテム選択イベントの処理 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_ITEM0: Intent intent = new Intent(this, cogoter.project.MyActivity.class); startActivity(intent); return true; case MENU_ITEM1: showDialog(this,"","ぶくぶくを押した"); return true; } return true; } //ダイアログの表示 private static void showDialog(Context context,String title,String text) { AlertDialog.Builder ad=new AlertDialog.Builder(context); ad.setTitle(title); ad.setMessage(text); ad.setPositiveButton("OK",null); ad.show(); } //リソース→ビットマップ public static Bitmap res2bmp(Context context,int resID) { return BitmapFactory.decodeResource( context.getResources(),resID); } }」 ・呼び出されるソースコード 「public class MyActivity extends Activity implements View.OnClickListener { private final static int WC=LinearLayout.LayoutParams.WRAP_CONTENT; private final static int FP=LinearLayout.LayoutParams.FILL_PARENT; private EditText editText;//エディットテキスト //アクティビティ起動時に呼ばれる @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); requestWindowFeature(Window.FEATURE_NO_TITLE); //戻り値の指定(6) setResult(Activity.RESULT_CANCELED); //インテントからのパラメータ取得(5) String text=""; Bundle extras=getIntent().getExtras(); if (extras!=null) text=extras.getString("text"); //レイアウトの生成 LinearLayout layout=new LinearLayout(this); layout.setBackgroundColor(Color.rgb(255,255,255)); layout.setOrientation(LinearLayout.VERTICAL); setContentView(layout); //OKボタンの生成 Button button=new Button(this); button.setText("OK"); button.setOnClickListener(this); button.setLayoutParams(new LinearLayout.LayoutParams(WC,WC)); layout.addView(button); //エディットテキストの生成 editText=new EditText(this); editText.setText(text); editText.setLayoutParams(new LinearLayout.LayoutParams(FP,WC)); layout.addView(editText); } //ボタンクリック時に呼ばれる public void onClick(View v) { //戻り値の指定(6) Intent intent =new Intent(); intent.putExtra("text",editText.getText().toString()); setResult(Activity.RESULT_OK,intent); //アクティビティの終了(7) finish(); } }」

  • 2つのEditTextに同じ関数を使いたい

    お世話になります。 JAVA eclipseでアプリを作成しています。 下記のソースで、onCreate時に、 (5行目)HogeText1に対して、「override:onCreateActionMode」で 処理を追加しています。 この処理を,HogeText2に対しても同じ処理を入れたいたのですが、 どのようにすれば、綺麗にかけるでしょうか? ※現在は、 final EditText editText = (EditText) findViewById(R.id.HogeText1); 以下の文を final EditText editText = (EditText) findViewById(R.id.HogeText2); にして、テキストビューの数、繰り返しています。 何卒宜しくお願いします。 -------------------------------- public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText editText = (EditText) findViewById(R.id.HogeText1); editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { menu.removeItem(android.R.id.paste); menu.removeItem(android.R.id.cut); menu.removeItem(android.R.id.copy); } }; ------------------------------------------

    • ベストアンサー
    • Java
  • androidのアプリを作ってるんですが

    import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.TextView; import android.content.Intent; import android.widget.ImageView; public class GameActivity extends Activity implements OnTouchListener{ private ImageView target; @Override protected void onCreate(Bundle savedInstanceState) { target = (ImageView)findViewById(R.id.imageView1); super.onCreate(savedInstanceState); setContentView(R.layout.activity_game); target.setOnTouchListener(this); } @Override public boolean onTouch(View v, MotionEvent motion) { switch(motion.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_UP: break; } return true; } } これからゲーム本体を作っていこうとしてるんですが、onTouchメソッドを実装してから実機で動作しなくなり、先に進めず困っています。なぜこれで動作しないのか私の知識不足でよくわかりません。 回答お願いいたします。

    • ベストアンサー
    • Java
  • Android JAVAへでの質問です

    (←※この部分!) の意味がわからないのでどなたか教えていただけないでしょうか? private EditText edit1; ですが、なぜ private がついているのでしょうか?なくても動きましたが何か意味があるのでしょうか? そしてどうして、この子はここにいるのでしょうか? Button btn1 と一緒に仲良くいてもいいんじゃないでしょうか? ================ import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.view.*; import android.view.View.OnClickListener; import android.widget.*; public class Test2Activity extends Activity { private EditText edit1;(←※この部分!) @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); edit1 = (EditText)this.findViewById(R.id.EditText1); Button btn1 = (Button)this.findViewById(R.id.button1); btn1.setOnClickListener(new MyClickA()); } class MyClickA implements OnClickListener { public void onClick(View view){ Editable e = edit1.getText(); int n = Integer.parseInt(e.toString()); Toast toast = Toast.makeText(getApplicationContext(), "数値=" + n, Toast.LENGTH_SHORT); toast.show(); } } }

    • ベストアンサー
    • Java
  • EditTextからフォーカスを外す処理

    Androidのプログラミングで、EditText(入力widget)をExcelのセルのように5つ並べて計算させる画面があります。 XML上のEditTextは5つあり、下記はボタン[btnUpdate]をクリックしたとき、5つめのEditTextにフォーカスが1度あたる(カーソルが入る)ようになっています。 EditText editText5 = (EditText)findViewById(R.id.editText5); editText5.setOnFocusChangeListener(this); Button btnUpdate = (TextView)findViewById(R.id.btnUpdate); btnUpdate.setOnClickListener(this); btnUpdate.setOnFocusChangeListener(this); //以下、メソッド部 ==========================/ @Override public void onClick(View v) { if(v == btnUpdate) { editText5.requestFocus(); // EditText5にフォーカスをあてる    (EditText同士の計算処理) //* ここにフォーカスが外れる記述をしたい */ } } カーソルがeditText5に入った状態(フォーカスがあたったまま)になると、editText1~5の数字が計算されるようになっています。 カーソルが点滅した状態で処理が終わるのですが、処理後はカーソル点滅をやめたいので、editTextからフォーカスをはずしたいと思っています。 質問:カーソルが消える(処理後フォーカスがすべてのEditTextから外れる)状態にする記述(requestFocus();の逆のメソッド)がわかりません。 よろしくお願いします。

  • Androidのレイアウトについて

    XMLで作成したTextViewを処理中に色を変えることは出来ないのでしょうか? 下記のようにやれば実装できるのでは?と思ってやってみましたがダメでした、 XMLファイルを使った方法で文字の色を変更する事は可能ですか? hogehoge.xml---------------------------------------------- <TextView android:id="@+id/text" android:textColor="@color/black" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="hogehoge" /> hogehoge.java--------------------------------------------- EditText textView=(EditText)findViewById(R.id.text); textView.setTextColor(Color.RED); ---------------------------------------------------------

  • androidでアプリを作ろうとしてるのですが

    package com.example.test; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; public class InOutTest extends Activity { /** Called when the activity is first created. */ public TextView txtInfo; public EditText edtText; public Button outputbutton; public TextView txtResult; public TextView txtjudge; public String strInch; public String gettext; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //レイアウト作成 ここから LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); setContentView(layout); //レイアウトを見えるようにする //レイアウト作成 ここまで //GUI部品作成 ここから // ラベル txtInfo = new TextView(this); txtInfo.setText("check"); strInch = ("check"); layout.addView(txtInfo); // エディタ edtText = new EditText(this); layout.addView(edtText); // ボタン txtResult = new Button(this); txtResult.setText("same or difference"); layout.addView(txtResult); // 結果表示用ラベル txtjudge = new TextView(this); txtjudge.setText("check"); layout.addView(txtjudge); //GUI部品作成 ここまで txtResult.setOnClickListener(new OnClickListener(){ public void onClick(View v) { gettext = edtText.toString(); if (strInch==gettext){ txtjudge.setText("ok"); } }; }); }} 上のプログラムで strInchに入ってるデータとgettextで取得した文章を比較して同じなら txtjudgeにOKと引き渡して表示させたいのですがうまく動きません 何方かどうぞよろしくお願い致します

    • ベストアンサー
    • Java
  • nullpointexceptionについて

    プログラミング初心者です。 エラーが全くわかりません。 ボタンを押すと、リストビューに移動するというものなんですが、ボタンを押すとnullpointexceptionが出ます。 最後の、et.setText(str);でエラーになっているようなんですが、 お分かりになる方いらっしゃいますか・・・? よろしくお願いいたします。 public class MainActivity extends Activity { EditText text_naiyou =null; Button save=null; Button buck=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); save=(Button)findViewById(R.id.save); buck=(Button)findViewById(R.id.buck); text_naiyou=(EditText)findViewById(R.id.text_naiyou); save.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { EditText et = (EditText)findViewById(R.id.text_naiyou); String str = et.getText().toString(); Intent intent = new Intent(); intent.setClass(getApplicationContext(), ListActivity.class); String pkg = getPackageName(); intent.putExtra(pkg + ".input",str); startActivity(intent); public class ListActivity extends Activity { EditText text_naiyou =null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list); Intent intent = getIntent(); String pkg = getPackageName(); String str = intent.getStringExtra(pkg + ".input"); EditText et = (EditText)findViewById(R.id.text_naiyou); et.setText(str);

  • Androidプログラムについて

    多数の画像を、パラパラ漫画のように切り替えていく方法について相談があり、投稿させていただきました。 以前、xmlファイルで画像を読み込む方法が簡単だということで、hirotn様にご回答いただき、 動作させることができました。 ありがとうございました。 携帯の実機にインストールし、エラーも出ず動作することも確認できたのですが、 画像を切り替えるタイミングがあまりにも遅くなっており困っています。 画像が多い場合は、メモリ不足等起こっているのでしょうか。 プログラムで解決できる方法があれば教えていただきたく、よろしくお願いします。 (ちなみに、xmlファイルで読み出すファイルは100枚程度(80MB程度)です。 もっと数を増やしたり、画質をよくしたいとも思っております。) ※サンプルは下記で見つけました。 http://monoist.atmarkit.co.jp/mn/articles/1205/21/news003.html (以下、プログラム) package jp.test.animation.frame; import android.app.Activity; import android.content.Context; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class FrameAnimationTestActivity extends Activity { // ボタン Button mBtnAnimation; Button m5BtnAnimFromXML; // ビュー ImageView mImageAnimation; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mBtnAnimation = (Button) findViewById( R.id.button_animation ); m5BtnAnimFromXML = (Button) findViewById( R.id.button_anim_from_xml ); mImageAnimation = (ImageView) findViewById( R.id.image_animation ); mBtnAnimation.setOnClickListener(mClickListener); m5BtnAnimFromXML.setOnClickListener(mClickListener); } View.OnClickListener mClickListener = new View.OnClickListener() { public void onClick(View v) { // アニメーション中なら、停止 Drawable d = mImageAnimation.getBackground(); if( d != null ){ try{ if( ((AnimationDrawable) d).isRunning() ){ ((AnimationDrawable) d).stop(); return; } } catch( RuntimeException e ){ e.printStackTrace(); } } //if( v == mBtnAnimation ){ //frameAnimationTest( //FrameAnimationTestActivity.this, mImageAnimation ); //} if( v == m5BtnAnimFromXML ){ frameAnimationFromXMLTest( mImageAnimation ); } } }; // フレームアニメーションを XML から読み込む void frameAnimationFromXMLTest( View v ){ // リソースからアニメーションを読み込み、ビューに設定 v.setBackgroundResource( R.drawable.droid_jump ); // ビューからアニメーションを取り出し AnimationDrawable anim = (AnimationDrawable)v.getBackground(); // アニメーション開始 anim.start(); } }

  • androidアプリ開発について

    androidアプリ開発初心者です。 やりたいことは、 スタートボタンを押して、自分のお気に入りのページに飛び、(例えばオークションなど)サイトを表示させ、何分間ごとに更新できるループ処理?などができればいいなと考えています。 スタートボタンを押してサイトを表示するまでは何とか作れたのですが、それ以降をどのように作ったらいいのか分かりません。 初心者的な質問で申し訳ないのですが、どのように書いたらよいのか教えてください。 コードはこのようになっています。 <<main.xml>> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/button1" android:layout_width="192dp" android:layout_height="wrap_content" android:text="スタート" /> </LinearLayout> <<MainActivity.java>> import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { Button btn =null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn=(Button)findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ Uri uri =Uri.parse("http://"); Intent intent=new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(uri); startActivity(intent); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 長文で申し訳ありません。どうぞ宜しくお願い致します。