![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
Android開発(switch文)について
Androidアプリ開発における
listviewについて質問させてください。
現在、"東京","神奈川","千葉","埼玉","茨城","栃木","群馬"
画面から東京を選び、"新宿","上野","秋葉原"が表示されています。
public void onBackPressed を追加したことにより
一つ前の画面に戻る事ができたのですが
このような記述で問題ないでしょうか?
もっとシンプルなやり方があれば、アドバイス願います。
また、"新宿","上野","秋葉原"画面から
新宿を選んだ時は、shinjyuku.html
上野を選んだときは、ueno.html
秋葉原を選んだ時は、akihabara.html を表示したいのですが
どのタイミングで、switch文を入れれば良いのでしょうか?
■searchActivity.java
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.*;
import android.widget.AdapterView.OnItemClickListener;
public class searchActivity extends Activity {
private ListView list;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
String[] arr = {"東京","神奈川","千葉","埼玉","茨城","栃木","群馬"};
// コンポーネントの設定
list = (ListView)this.findViewById(R.id.list);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list, arr);
list.setAdapter(adapter);
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
setList2(arg3);
}
});
}
private void setList2(long id) {
String[] tokyo = {"新宿","上野","秋葉原"};
String[] kanagawa = {"横浜","桜木町","関内","新横浜"};
String[] chiba = {"千葉","市川","船橋"};
String[] saitama = {"大宮","浦和","蕨","川口・西川口"};
ArrayAdapter<String> adapter = null;
switch ((int)id) {
case 0:
adapter = new ArrayAdapter<String>(this, R.layout.list, tokyo);
break;
case 1:
adapter = new ArrayAdapter<String>(this, R.layout.list, kanagawa);
break;
case 2:
adapter = new ArrayAdapter<String>(this, R.layout.list, chiba);
break;
case 3:
adapter = new ArrayAdapter<String>(this, R.layout.list, saitama);
break;
}
list.setVisibility(View.GONE);
ListView list2 = (ListView)this.findViewById(R.id.list2);
list2.setAdapter(adapter);
list2.setVisibility(View.VISIBLE);
}
//ここを追加
@Override
public void onBackPressed() {
//メニュー画面に戻る(start)
setContentView(R.layout.main);
String[] arr = {"東京","神奈川","千葉","埼玉","茨城","栃木","群馬"};
list = (ListView)this.findViewById(R.id.list);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list, arr);
list.setAdapter(adapter);
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
setList2(arg3);
}
});
}
}
■main.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:textSize="20sp"
android:background="#ffffff">
<ListView
android:id="@+id/list"
android:visibility="visible"
android:layout_height="fill_parent" android:layout_width="fill_parent"/>
<ListView
android:id="@+id/list2"
android:visibility="gone"
android:layout_width="fill_parent" android:layout_height="fill_parent"/>
</RelativeLayout>
■list.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textSize="20sp"
android:paddingTop="50.0px"
android:paddingLeft="20.0px"
android:background="#ffffff"
android:textColor="#000000"
/>
以上、宜しくお願いいたします。
No.6ベストアンサー
- 回答日時:
>戻るキーが押された場合の処理ですが
>現在表示中の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);
}
}
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);
}
}
~省略~
No.8
- 回答日時:
>違うActivity(画面遷移)はこのタイミングでいいのでしょうか?
ダメと思う理由はなんですか?何が問題だと思っていますか?
>また、cityなど変数の値は引き継がれるのでしょうか?
Activityはそれぞれ独立しているので、変数などをお互いに参照し
あうことはできません。そもそも、他のActivityが存在しているかは
保障されません。
必要なデータは、Intentに付加して起動先のActivityへ渡すように
します。
参考URL:http://developer.android.com/intl/ja/guide/topic …
>>ダメと思う理由はなんですか?何が問題だと思っていますか?
このタイミングだと、全ての条件結果に「startActivity・・・・」を入れる必要があるので、他に良い方法はないかな?と思いました。
case 0:
// 東京の1つ目のページへ飛ぶ
startActivity(new Intent(this, webActivity.class));
break;
case 1:
// 東京の2つ目のページへ飛ぶ
startActivity(new Intent(this, webActivity.class));
break;
No.7
- 回答日時:
戻るわけがありません。
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;
}
}
}
~省略~
No.5
- 回答日時:
>因みに、以下のような条件判断は可能なのでしょうか?
もちろん可能ですよ。
いつもりがとうございます。
int city;と宣言していたのですが
private int city;としたら、うまく動きました。
最後に、もう一つ教えてください。
戻るキーが押された場合の処理ですが
現在表示中のlistやwebviewは
どのように判断するのでしょうか?
@Override
public void onBackPressed() {
// 表示中のlistによって処理を分ける必要があります
// list2が表示されているときの処理
list2.setVisibility(View.GONE);
list.setVisibility(View.VISIBLE);
// list1が表示されているときの処理
super.onBackPressed();
}
No.4
- 回答日時:
参照URLが、ListViewで表示するデータをListで管理するようになっている
ので、リスト1項目に複数のデータを関連付けたい場合の参考になると思い
ますよ。
参考URL:http://ichitcltk.hustle.ne.jp/gudon/modules/pico …
こちらを参考にして、項目に複数のデータを関連付ける方法も勉強してみたいと思います。
うまく動いていませんが、
因みに、以下のような条件判断は可能なのでしょうか?
~省略~
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;
}
}
}
~省略~
No.3
- 回答日時:
ObjectはJavaの基本なので、まずはそこをしっかりと勉強すると良いですよ。
>List1を、東京、神奈川、千葉、埼玉の4つとした場合でも
>条件判断は複雑になりますか?
複雑というよりか、冗長な処理というのが正しいですね。
それぞれの項目選択時の処理は、インデックスが違うだけでやりたいことは同じなので、
プログラムでインデックスを判断するのではなく、インデックスにより情報を一意に
取り出せるように作ります。
そうすれば、リスト項目が増えてもプログラムは変更しなくてもいいですね。
Objectをしっかり勉強したいと思います。
インデックスにより情報を取り出すとの事ですが
サンプルや、解説されているURL、本等があれば、教えて頂けないでしょうか?
No.2
- 回答日時:
>jumpPageメソッドを都道府県分、設置するということでしょうか?
その通りです。
リストは選択された行の情報が取れるだけですから、jumpPageではlist2で
選択された行が分かるだけです。
しかし、表示するページはその前のlist1で選択された行がどれなのかにも
依存するので、その判断が必要になります。
それを条件判断でやろうとすると、とんでもない数の条件文の固まりになっ
てしまうので、良い方法ではないですね。
やるとしたら、list2の情報を文字列ではなく、地名とHTMLの両方の情報を
持ったObjectにして、リストに表示する情報とクリックされて表示するペー
ジの情報を管理するのが良いと思います。
>list2の情報を文字列ではなく、地名とHTMLの両方の情報を
持ったObjectに・・・
私のレベルでは、まったくイメージできないです。
List1を、東京、神奈川、千葉、埼玉の4つとした場合でも
条件判断は複雑になりますか?
No.1
- 回答日時:
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;
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- アプリ Android studio 初心者 Hello Android!しか表示されない 1 2023/08/01 08:47
- VPN 何これ 1 2022/04/19 01:32
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- C言語・C++・C# クラスのメンバ変数を基準に並べ替えをしたい 5 2022/12/25 17:40
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Java java final 1 2022/06/10 22:49
- JavaScript 2段階プルダウンで1段階目の選択を終えた後に選択ボックスを見えなくしたい 2 2022/07/05 21:58
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
androidプログラムのエラーにつ...
-
Android開発(switch文)について
-
Google8とiPhoneseどっちを、買...
-
クラシルリワード って、旧スマ...
-
dアカウントのこの端末登録名っ...
-
親名義でスマホをdocomo契約し...
-
格安スマホ複数持ちでのポイ活...
-
Googleフォトにバックアップし...
-
電波マークが2つあるのですが、...
-
Fireタブレットで、この「端末...
-
アンドロイド版モンスト 動作重...
-
機種変更する時の、Googleアカ...
-
ahamoでデザリングを使う操作を...
-
最近スマホの調子がおかしいで...
-
Androidアプリ、auとdocomo別々?
-
端末からhtmlファイルをブラウ...
-
PCからスマホ端末保存による情...
-
機種変更しようか迷ってます。 ...
-
xperiaのsov36と、so01kの違い...
-
ワイモバイルスマホ、フィルタ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
androidアプリ開発 -間違い探...
-
androidプログラムのエラーにつ...
-
android.os.Systemをimport
-
Musicカウントフリー適用外?
-
canvas を android で見ると...?
-
android AVDからネットワーク接続
-
Androidプログラムについて
-
エミュレーターでAndroidMarket...
-
スクショを消さずにスマホに残...
-
perlでアクセス端末の解像度を...
-
バージョンアップ後の不具合
-
Android開発(switch文)について
-
さっき、YouTubeをandroidでみ...
-
Android開発の初心者です。分か...
-
スマホアプリ、GANMAが、ば―ジ...
-
Androidアプリ 通信について
-
Googleフォトにバックアップし...
-
Androidスマートフォンについて...
-
クラシルリワード って、旧スマ...
-
SIMフリーとはなにか
おすすめ情報