spinnerのチェンジイベント
コンボボックスと同等の機能であるSpinnerコントロールのインデックスが変更された場合
の処理のサンプルとなります。
このサンプルでは前回インデックスをTagに格納していますが
便宜的にしているだけであり、設計上にあわせて変更する方が望ましいと思います。
package com.example.test.test61;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.RelativeLayout;
import android.widget.Spinner;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
init();
createScreen();
}
private int mNo3=0;
private int mNo4=0;
private ArrayAdapter<String> adapter=null;
private void init()
{
adapter= new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item);
adapter.add("北海道");
adapter.add("青森県");
adapter.add("秋田県");
adapter.add("岩手県");
adapter.add("宮城県");
adapter.add("山形県");
adapter.add("福島県");
}
//Spinnerによるコンボボックスと同等な機能を実装するテスト
private void createScreen()
{
RelativeLayout layout = new RelativeLayout(this);
setContentView(layout);
//座標の初期設定
int x=0;
int y=0;
int width=0;
int height=0;
//配置を設定
x=50;
y=50;
width=350;
height=150;
RelativeLayout.LayoutParams obj1 = null;
obj1=getLayoutObject(width, height);
obj1.leftMargin=x;
obj1.topMargin=y;
TextView textView = new TextView(this);
mNo4 = View.generateViewId();
textView.setId(mNo4);
textView.setText("ここに選択した結果が表示されます。");
layout.addView(textView,obj1);
textView=null;
//y座標の位置をずらしています。
y+=100;
x=50;
height=100;
obj1=getLayoutObject(width, height);
obj1.leftMargin=x;
obj1.topMargin=y;
Spinner spinner = new Spinner(this);
mNo3 = View.generateViewId();
spinner.setId(mNo3);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new SpinnerSelectedListener());
spinner.setSelection(0);
spinner.setTag(0);//ここに選択したインデックスを格納しておきます
layout.addView(spinner,obj1);
}
//setOnItemSelectedListenerで宣言したクラス名をここで実装して
//Changeイベントを実行します
private class SpinnerSelectedListener implements AdapterView.OnItemSelectedListener
{
public void onItemSelected(AdapterView parent,View view,int position, long id)
{
Log.d("onItemSelected","start");
int index=0;
int index_before=0;
String sResult = "";
Spinner spinner = (Spinner)findViewById(mNo3);
//選択されたインデックスを取得します
index=spinner.getSelectedItemPosition();
//前回のインデックスを取得します
index_before=(int)spinner.getTag();
if(index!=index_before)
{
sResult=String.format("前回のインデックスと異なります。\n" +
"今回のインデックス:%d\n" +
"前回のインデックス:%d",index,index_before);
//前回のインデックスと異なるケース
Log.d("結果",sResult);
//ex.)
//結果: 前回のインデックスと異なります。
//今回のインデックス:6
//前回のインデックス:2
TextView textView=(TextView)findViewById(mNo4);
textView.setText(sResult);
textView=null;
}
else
{
//前回のインデックスと同じケース
//意味がないようで、ここはシミュレータ上では実行されませんでした
Log.d("結果",String.format("前回のインデックスと変わりません " +
"インデックス:%d",index));
}
//今回選択されたインデックスをTagに格納します
spinner.setTag(index);
spinner=null;
Log.d("onItemSelected","end");
}
//何も選択されなかったケース
//意味がないようで、ここはシミュレータ上では実行されませんでした。
public void onNothingSelected(AdapterView parent)
{
Log.d("onNothingSelected","選択されませんでした。");
}
}
//レイアウトを決定するオブジェクトを生成し渡します
private RelativeLayout.LayoutParams getLayoutObject(int width, int height)
{
return new RelativeLayout.LayoutParams(width, height);
}
}
|
チェンジイベント用のクラスを次のように宣言して追加します。
(例)
宣言している箇所
spinner.setOnItemSelectedListener(new SpinnerSelectedListener());
クラスで実装する部分の例
private class SpinnerSelectedListener implements AdapterView.OnItemSelectedListener
{
public void onItemSelected(AdapterView parent,View view,int position, long id)
{
(省略)
}
public void onNothingSelected(AdapterView parent)
{
(省略)
}
}
クラス内には「onItemSelected」と「onNothingSelected」を実装してください。
「onNothingSelected」は使わなくてもimplementsなので必要となります。
ここではTagに前回インデックスを格納しています。
そのためgetTagをintにキャストして取得した内容と
getSelectedItemPositionで取得した選択されたインデックスを比較しています。
さいごに今回選択されたインデックスをTagに再格納することで
次の比較のための準備をしています。
(例)
spinner.setTag(index);
実行結果
次のように変更した内容がTextViewに表示するようにサンプル上ではしました。
|
|