こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Android開発(switch文)について

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"

/>


以上、宜しくお願いいたします。

投稿日時 - 2011-05-19 16:11:40

QNo.6748698

すぐに回答ほしいです

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

>戻るキーが押された場合の処理ですが
>現在表示中の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);
}
}

投稿日時 - 2011-05-25 23:54:59

お礼

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);
}
}

~省略~

投稿日時 - 2011-05-26 15:33:50

ANo.6

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.8

>違うActivity(画面遷移)はこのタイミングでいいのでしょうか?

ダメと思う理由はなんですか?何が問題だと思っていますか?

>また、cityなど変数の値は引き継がれるのでしょうか?

Activityはそれぞれ独立しているので、変数などをお互いに参照し
あうことはできません。そもそも、他のActivityが存在しているかは
保障されません。

必要なデータは、Intentに付加して起動先のActivityへ渡すように
します。

参考URL:http://developer.android.com/intl/ja/guide/topics/fundamentals/activities.html

投稿日時 - 2011-05-27 14:44:14

お礼

>>ダメと思う理由はなんですか?何が問題だと思っていますか?


このタイミングだと、全ての条件結果に「startActivity・・・・」を入れる必要があるので、他に良い方法はないかな?と思いました。


case 0:
// 東京の1つ目のページへ飛ぶ
startActivity(new Intent(this, webActivity.class));
break;
case 1:
// 東京の2つ目のページへ飛ぶ
startActivity(new Intent(this, webActivity.class));
break;

投稿日時 - 2011-05-30 10:17:26

ANo.7

戻るわけがありません。
setContentView(webview, new LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
で、リスト画面をブラウザの画面で書きつぶしてしまっているので、
戻りようがないのです。

setContentView()メソッドがどうのような役割をしているものなのかを
まずは理解する必要があります。

それから、リスト画面→ブラウザという場合には、違うActivityを
用意して画面遷移を行うようにした方がよいですよ。

投稿日時 - 2011-05-26 17:05:26

お礼

違う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;
}
}
}

~省略~

投稿日時 - 2011-05-27 11:20:59

ANo.5

>因みに、以下のような条件判断は可能なのでしょうか?

もちろん可能ですよ。

投稿日時 - 2011-05-24 18:46:49

お礼

いつもりがとうございます。

int city;と宣言していたのですが
private int city;としたら、うまく動きました。


最後に、もう一つ教えてください。
戻るキーが押された場合の処理ですが
現在表示中のlistやwebviewは
どのように判断するのでしょうか?


@Override
public void onBackPressed() {
// 表示中のlistによって処理を分ける必要があります
// list2が表示されているときの処理
list2.setVisibility(View.GONE);
list.setVisibility(View.VISIBLE);
// list1が表示されているときの処理
super.onBackPressed();
}

投稿日時 - 2011-05-25 15:32:28

ANo.4

参照URLが、ListViewで表示するデータをListで管理するようになっている
ので、リスト1項目に複数のデータを関連付けたい場合の参考になると思い
ますよ。

参考URL:http://ichitcltk.hustle.ne.jp/gudon/modules/pico_rd/index.php?content_id=70

投稿日時 - 2011-05-23 18:17:55

お礼

こちらを参考にして、項目に複数のデータを関連付ける方法も勉強してみたいと思います。


うまく動いていませんが、
因みに、以下のような条件判断は可能なのでしょうか?



~省略~

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;
}
}
}


~省略~

投稿日時 - 2011-05-24 10:36:58

ANo.3

ObjectはJavaの基本なので、まずはそこをしっかりと勉強すると良いですよ。

>List1を、東京、神奈川、千葉、埼玉の4つとした場合でも
>条件判断は複雑になりますか?

複雑というよりか、冗長な処理というのが正しいですね。
それぞれの項目選択時の処理は、インデックスが違うだけでやりたいことは同じなので、
プログラムでインデックスを判断するのではなく、インデックスにより情報を一意に
取り出せるように作ります。
そうすれば、リスト項目が増えてもプログラムは変更しなくてもいいですね。

投稿日時 - 2011-05-22 17:16:49

お礼

Objectをしっかり勉強したいと思います。
インデックスにより情報を取り出すとの事ですが
サンプルや、解説されているURL、本等があれば、教えて頂けないでしょうか?

投稿日時 - 2011-05-23 11:08:22

ANo.2

>jumpPageメソッドを都道府県分、設置するということでしょうか?

その通りです。
リストは選択された行の情報が取れるだけですから、jumpPageではlist2で
選択された行が分かるだけです。
しかし、表示するページはその前のlist1で選択された行がどれなのかにも
依存するので、その判断が必要になります。

それを条件判断でやろうとすると、とんでもない数の条件文の固まりになっ
てしまうので、良い方法ではないですね。

やるとしたら、list2の情報を文字列ではなく、地名とHTMLの両方の情報を
持ったObjectにして、リストに表示する情報とクリックされて表示するペー
ジの情報を管理するのが良いと思います。

投稿日時 - 2011-05-21 11:49:01

お礼

>list2の情報を文字列ではなく、地名とHTMLの両方の情報を
持ったObjectに・・・

私のレベルでは、まったくイメージできないです。


List1を、東京、神奈川、千葉、埼玉の4つとした場合でも
条件判断は複雑になりますか?

投稿日時 - 2011-05-21 12:38:56

ANo.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のデータ構造を含めて、考えていかないと
全都道府県に対応しようとすると大変なことになると思いますよ。

投稿日時 - 2011-05-20 17:55:07

お礼

いつも、的確なアドバイス
ありがとうございます。

↓こちらだと、どちらも同じページに飛んでしました。
東京→新宿→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;
}
}

投稿日時 - 2011-05-21 09:42:43

あなたにオススメの質問