- ベストアンサー
Android開発(switch文)について
- Android開発において、switch文を使用する方法についての質問です。現在、画面から都道府県を選び、その選択に応じて都市を表示したいと考えています。一つ前の画面に戻るためには、onBackPressedメソッドを使用していますが、もっとシンプルな方法があればアドバイスをいただきたいです。
- また、都市を選んだ際に、「新宿」「上野」「秋葉原」に応じてそれぞれのページを表示したいと考えています。どのタイミングでswitch文を使用すれば良いのでしょうか。
- searchActivity.javaでは、都道府県を選択するためのListViewと、選択した都市を表示するためのListViewがあります。onCreateメソッドで都道府県のリストを設定し、setList2メソッドで都市のリストを設定しています。onBackPressedメソッドでは、メニュー画面に戻る処理を行っています。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
>戻るキーが押された場合の処理ですが >現在表示中のlistやwebviewは >どのように判断するのでしょうか? 単純にどちらのListViewが表示しているかで判断すればよいと思いますよ。 public void onBackPressed() { if (list.getVisibility() == View.VISIBLE) { // list1が表示されているときの処理 super.onBackPressed(); } else if (list2.getVisibility() == View.VISIBLE) { // list2が表示されているときの処理 list2.setVisibility(View.GONE); list.setVisibility(View.VISIBLE); } }
その他の回答 (7)
- foofoo0
- ベストアンサー率42% (39/92)
>違うActivity(画面遷移)はこのタイミングでいいのでしょうか? ダメと思う理由はなんですか?何が問題だと思っていますか? >また、cityなど変数の値は引き継がれるのでしょうか? Activityはそれぞれ独立しているので、変数などをお互いに参照し あうことはできません。そもそも、他のActivityが存在しているかは 保障されません。 必要なデータは、Intentに付加して起動先のActivityへ渡すように します。
お礼
>>ダメと思う理由はなんですか?何が問題だと思っていますか? このタイミングだと、全ての条件結果に「startActivity・・・・」を入れる必要があるので、他に良い方法はないかな?と思いました。 case 0: // 東京の1つ目のページへ飛ぶ startActivity(new Intent(this, webActivity.class)); break; case 1: // 東京の2つ目のページへ飛ぶ startActivity(new Intent(this, webActivity.class)); break;
- foofoo0
- ベストアンサー率42% (39/92)
戻るわけがありません。 setContentView(webview, new LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); で、リスト画面をブラウザの画面で書きつぶしてしまっているので、 戻りようがないのです。 setContentView()メソッドがどうのような役割をしているものなのかを まずは理解する必要があります。 それから、リスト画面→ブラウザという場合には、違うActivityを 用意して画面遷移を行うようにした方がよいですよ。
お礼
違うActivity(画面遷移)はこのタイミングでいいのでしょうか? また、cityなど変数の値は 引き継がれるのでしょうか? ~省略~ public ListView list2; private int city; public void setList2(long id) { String[] tokyo = {"池袋","上野","秋葉原"}; String[] kanagawa = {"横浜","桜木町","関内","新横浜"}; String[] chiba = {"千葉","市川","船橋"}; String[] saitama = {"大宮","浦和","蕨","川口・西川口"}; ArrayAdapter<String> adapter = null; switch ((int)id) { case 0: city = 10; adapter = new ArrayAdapter<String>(this, R.layout.list, tokyo); break; case 1: city = 20; adapter = new ArrayAdapter<String>(this, R.layout.list, kanagawa); break; case 2: city = 30; adapter = new ArrayAdapter<String>(this, R.layout.list, chiba); break; case 3: city = 40; adapter = new ArrayAdapter<String>(this, R.layout.list, saitama); break; } list.setVisibility(View.GONE); list2 = (ListView)this.findViewById(R.id.list2); list2.setAdapter(adapter); list2.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { jumpPage(arg3); } }); list2.setVisibility(View.VISIBLE); } private void jumpPage(long id) { switch (city) { case 10: switch ((int)id) { case 0: // 東京の1つ目のページへ飛ぶ startActivity(new Intent(this, webActivity.class)); //setContentView(R.layout.web); //WebView webView = (WebView)findViewById(R.id.web); //webView.setWebViewClient(new WebViewClient()); //webView.loadUrl("http://google.co.jp"); break; case 1: // 東京の2つ目のページへ飛ぶ //setContentView(R.layout.web); //WebView webView1 = (WebView)findViewById(R.id.web); //webView1.setWebViewClient(new WebViewClient()); //webView1.loadUrl("http://yahoo.co.jp"); break; case 2: // 東京の3つ目のページへ飛ぶ break; } case 20: switch ((int)id) { case 0: // 神奈川の1つ目のページへ飛ぶ break; case 1: // 神奈川の2つ目のページへ飛ぶ break; case 2: // 神奈川の3つ目のページへ飛ぶ break; } case 30: switch ((int)id) { case 0: // 千葉の1つ目のページへ飛ぶ break; case 1: // 千葉の2つ目のページへ飛ぶ break; case 2: // 千葉の3つ目のページへ飛ぶ break; } case 40: switch ((int)id) { case 0: // 埼玉の1つ目のページへ飛ぶ break; case 1: // 埼玉の2つ目のページへ飛ぶ break; case 2: // 埼玉の3つ目のページへ飛ぶ break; } } } ~省略~
- foofoo0
- ベストアンサー率42% (39/92)
>因みに、以下のような条件判断は可能なのでしょうか? もちろん可能ですよ。
お礼
いつもりがとうございます。 int city;と宣言していたのですが private int city;としたら、うまく動きました。 最後に、もう一つ教えてください。 戻るキーが押された場合の処理ですが 現在表示中のlistやwebviewは どのように判断するのでしょうか? @Override public void onBackPressed() { // 表示中のlistによって処理を分ける必要があります // list2が表示されているときの処理 list2.setVisibility(View.GONE); list.setVisibility(View.VISIBLE); // list1が表示されているときの処理 super.onBackPressed(); }
- foofoo0
- ベストアンサー率42% (39/92)
参照URLが、ListViewで表示するデータをListで管理するようになっている ので、リスト1項目に複数のデータを関連付けたい場合の参考になると思い ますよ。
お礼
こちらを参考にして、項目に複数のデータを関連付ける方法も勉強してみたいと思います。 うまく動いていませんが、 因みに、以下のような条件判断は可能なのでしょうか? ~省略~ switch ((int)id) { case 0: adapter = new ArrayAdapter<String>(this, R.layout.list, tokyo); //ここに変数を入れることは可能でしょうか? city = 10; break; case 1: adapter = new ArrayAdapter<String>(this, R.layout.list, kanagawa); //ここに変数を入れることは可能でしょうか? city = 20; break; case 2: adapter = new ArrayAdapter<String>(this, R.layout.list, chiba); //ここに変数を入れることは可能でしょうか? city = 30; break; case 3: adapter = new ArrayAdapter<String>(this, R.layout.list, saitama); //ここに変数を入れることは可能でしょうか? city = 40; break; } ~省略~ private void jumpPage(long id) { switch (city) { case 10: switch ((int)id) { case 0: // 東京の1つ目のページへ飛ぶ break; case 1: // 東京の2つ目のページへ飛ぶ break; case 2: // 東京の3つ目のページへ飛ぶ break; } case 20: switch ((int)id) { case 0: // 神奈川の1つ目のページへ飛ぶ break; case 1: // 神奈川の2つ目のページへ飛ぶ break; case 2: // 神奈川の3つ目のページへ飛ぶ break; } case 30: switch ((int)id) { case 0: // 千葉の1つ目のページへ飛ぶ break; case 1: // 千葉の2つ目のページへ飛ぶ break; case 2: // 千葉の3つ目のページへ飛ぶ break; } case 40: switch ((int)id) { case 0: // 埼玉の1つ目のページへ飛ぶ break; case 1: // 埼玉の2つ目のページへ飛ぶ break; case 2: // 埼玉の3つ目のページへ飛ぶ break; } } } ~省略~
- foofoo0
- ベストアンサー率42% (39/92)
ObjectはJavaの基本なので、まずはそこをしっかりと勉強すると良いですよ。 >List1を、東京、神奈川、千葉、埼玉の4つとした場合でも >条件判断は複雑になりますか? 複雑というよりか、冗長な処理というのが正しいですね。 それぞれの項目選択時の処理は、インデックスが違うだけでやりたいことは同じなので、 プログラムでインデックスを判断するのではなく、インデックスにより情報を一意に 取り出せるように作ります。 そうすれば、リスト項目が増えてもプログラムは変更しなくてもいいですね。
お礼
Objectをしっかり勉強したいと思います。 インデックスにより情報を取り出すとの事ですが サンプルや、解説されているURL、本等があれば、教えて頂けないでしょうか?
- foofoo0
- ベストアンサー率42% (39/92)
>jumpPageメソッドを都道府県分、設置するということでしょうか? その通りです。 リストは選択された行の情報が取れるだけですから、jumpPageではlist2で 選択された行が分かるだけです。 しかし、表示するページはその前のlist1で選択された行がどれなのかにも 依存するので、その判断が必要になります。 それを条件判断でやろうとすると、とんでもない数の条件文の固まりになっ てしまうので、良い方法ではないですね。 やるとしたら、list2の情報を文字列ではなく、地名とHTMLの両方の情報を 持ったObjectにして、リストに表示する情報とクリックされて表示するペー ジの情報を管理するのが良いと思います。
お礼
>list2の情報を文字列ではなく、地名とHTMLの両方の情報を 持ったObjectに・・・ 私のレベルでは、まったくイメージできないです。 List1を、東京、神奈川、千葉、埼玉の4つとした場合でも 条件判断は複雑になりますか?
- foofoo0
- ベストアンサー率42% (39/92)
onBackPressedメソッドで、最初の画面を再構築していますが、 list1は非表示になっているだけなので、それを再表示して やればよいです。 onBackPressedメソッドで、super.onBackPressed()を 呼び出さないと、戻るボタンでアプリを終了することが できなくなります。 ただ、これを呼んでしまうと、list2から戻るときにも 終了してしまうので、今表示されているリストがどちら なのかで、呼ぶか呼ばないかを制御する必要があります。 ザックリとですが、こんな感じになります。 private ListView list2; private void setList2(long id) { ~省略~ list2 = (ListView)this.findViewById(R.id.list2); list2.setAdapter(adapter); list2.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { jumpPage(arg3); } }); list2.setVisibility(View.VISIBLE); } private void jumpPage(long id) { switch ((int)id) { case 0: // List2の1つ目のページへ飛ぶ break; case 1: // List2の2つ目のページへ飛ぶ break; case 2: // List2の3つ目のページへ飛ぶ break; } } @Override public void onBackPressed() { // 表示中のlistによって処理を分ける必要があります // list2が表示されているときの処理 list2.setVisibility(View.GONE); list.setVisibility(View.VISIBLE); // list1が表示されているときの処理 super.onBackPressed(); } list2が押された時にjumpPageメソッドが呼ばれるように して、それぞれに対応したhtmlを表示する処理を追加すれば よいです。 ただし、list1でどれを選択されたかによっても変わってくる ものなので、list2のデータ構造を含めて、考えていかないと 全都道府県に対応しようとすると大変なことになると思いますよ。
お礼
いつも、的確なアドバイス ありがとうございます。 ↓こちらだと、どちらも同じページに飛んでしました。 東京→新宿→1つ目のページ(URL) 神奈川→横浜→1つ目のページ(URL) jumpPageメソッドを都道府県分、設置するということでしょうか? private ListView list2; private void setList2(long id) { ~省略~ list2 = (ListView)this.findViewById(R.id.list2); list2.setAdapter(adapter); list2.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { jumpPage(arg3); } }); list2.setVisibility(View.VISIBLE); } private void jumpPage(long id) { switch ((int)id) { case 0: // List2の1つ目のページへ飛ぶ break; case 1: // List2の2つ目のページへ飛ぶ break; case 2: // List2の3つ目のページへ飛ぶ break; } }
お礼
list1、list2からの戻るキーは正常に動きました! しかし、webが開いた画面から 戻るキーでlist2に戻したいのですが うまくいきません。 以下の、// list1でもlist2でもないときの処理 では何故戻らないのでしょか? ~省略~ private void jumpPage(long id) { switch (city) { case 10: switch ((int)id) { case 0: // 東京の1つ目のページへ飛ぶ WebView webview = new WebView(this); setContentView(webview, new LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); webview.loadUrl("http://xxx.xx.xx"); break; case 1: // 東京の2つ目のページへ飛ぶ WebView webview1 = new WebView(this); setContentView(webview1, new LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); webview1.loadUrl("http://xxx.xx.xx"); break; case 2: // 東京の3つ目のページへ飛ぶ break; } case 20: switch ((int)id) { case 0: // 神奈川の1つ目のページへ飛ぶ break; case 1: // 神奈川の2つ目のページへ飛ぶ break; case 2: // 神奈川の3つ目のページへ飛ぶ break; } case 30: switch ((int)id) { case 0: // 千葉の1つ目のページへ飛ぶ break; case 1: // 千葉の2つ目のページへ飛ぶ break; case 2: // 千葉の3つ目のページへ飛ぶ break; } case 40: switch ((int)id) { case 0: // 埼玉の1つ目のページへ飛ぶ break; case 1: // 埼玉の2つ目のページへ飛ぶ break; case 2: // 埼玉の3つ目のページへ飛ぶ break; } } } //ページの読み込み開始 @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { dialog = new Dialog(view.getContext()); dialog.setTitle("Now Loading"); dialog.show(); } //ページの読み込み完了 @Override public void onPageFinished(WebView view, String url) { disimissDialog(); } //ページの読み込み失敗 @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { if (null != dialog) { disimissDialog(); } Toast.makeText(view.getContext(), "エラー", Toast.LENGTH_LONG).show(); } public void onBackPressed() { if (list.getVisibility() == View.VISIBLE) { // list1が表示されているときの処理 super.onBackPressed(); } else if (list2.getVisibility() == View.VISIBLE) { // list2が表示されているときの処理 list2.setVisibility(View.GONE); list.setVisibility(View.VISIBLE); } else { // list1でもlist2でもないときの処理 list2.setVisibility(View.VISIBLE); } } ~省略~