コントロール配列
電卓のボタンに似せた数字と「C」(クリア)のみを使って
数字を入力するサンプルです。
import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
//画面サイズ取得のため使用
import android.util.DisplayMetrics;
//相対的レイアウト(RelativeLayout)を使用する宣言
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.RelativeLayout;
//クリックイベント用に追加
import android.view.View.OnClickListener;
//ボタンを宣言
import android.widget.Button;
//色の宣言
import android.graphics.Color;
//ログ出力の宣言
import android.util.Log;
public class MainActivity extends AppCompatActivity implements OnClickListener {
private int mWidth = 0;//幅
private int mHeight = 0;//高さ
private int[] arrayyIndex = new int[12];//コントロール用のID
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Displayは非推奨となりました。
//画面の高さと幅を取得します。
DisplayMetrics display = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(display);
mWidth = display.widthPixels;
mHeight = display.heightPixels;
//座標の初期設定
int x=0;
int y=0;
int width=0;
int height=0;
//コントロールに使用するIDを取得しておく
for(int i=0;i<12;i++)
{
arrayyIndex[i] = View.generateViewId();
}
//相対座標を設定できるようにレイアウトを設定
RelativeLayout layout = new RelativeLayout(this);
setContentView(layout);
//数字を入力した結果を表示するテキストボックス
y=50;
height=50;
width=300;
x = (mWidth - width) / 2;
Log.d("x",String.valueOf(x));
RelativeLayout.LayoutParams obj = getLayoutObject(width, height);
obj.leftMargin=x;
obj.topMargin=y;
EditText txt = new EditText(this);
txt.setId(arrayyIndex[11]);
txt.setText("");
//右寄せ
txt.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
txt.setEnabled(false);//入力不可にするため
txt.setBackgroundColor(Color.argb(70, 208, 208, 255));
layout.addView(txt, obj);
//縦方向
y+= height + 50;//微調整
//ボタンの縦と横の長さ
height = 80;
width = 80;
int iNo = 9;//ボタンに使用する数字
int idx = 0;//ID用のインデックス
int iInterval = 0;
iInterval=(mWidth - width * 3) /4;
for(int i=0; i < 4; i++)
{
for(int j=0; j < 3; j++)
{
//座標位置を計算・準備
x = iInterval * (j + 1) + width * j;
obj = getLayoutObject(width, height);
obj.leftMargin=x;
obj.topMargin=y;
Button btn=new Button(this);
btn.setId(arrayyIndex[idx]);
if(iNo > -1)
{
btn.setText(String.valueOf(iNo));
}
else
{
btn.setText("C");//クリアボタン
}
btn.setOnClickListener(this);
btn.setBackgroundColor(Color.argb(90, 209, 209, 209));
btn.setTag(idx);//このサンプルでは判定用として使用しています。
layout.addView(btn, obj);
iNo--;//表示する数字
idx++;//配列に使用するインデックスをインクリメント
//11個のボタン(0~9およびC)を生成したら処理を抜ける
//※idxは0から始めているため
if(idx > 10) break;
}
//次の座標位置を再計算
y += height + 10;//微調整
}
}
@Override
//ボタンがクリックされたら実行されます。
public void onClick(View view) {
int iViewId = 0;
int iData = 0;
String sData = "";
//コントロールに設定しているIDと照合するため
iViewId = view.getId();
//設定済みの各コントロールを呼び出すためオブジェクト化する
EditText txt = (EditText)findViewById(arrayyIndex[11]);
Button btn=(Button)findViewById(iViewId);
//11個目は「C」なので範囲を「x < 10」としています。
if(Integer.parseInt(btn.getTag().toString()) < 10)
{
//数字のボタンがタップされたケース
sData =txt.getText().toString();
sData=sData.concat(btn.getText().toString());
//Integerを使用しているので9桁を限度としています。
if(sData.length()>9)
{
sData=sData.substring(0,9);
}
iData = Integer.parseInt(sData) ;
txt.setText(String.valueOf(iData));
}
else
{
//「C」(クリア)ボタン
txt.setText("");
}
}
//レイアウトを決定するオブジェクトを生成し渡します
public RelativeLayout.LayoutParams getLayoutObject(int width,int height)
{
return new RelativeLayout.LayoutParams(width, height);
}
}
|
設置したコントロールをあとで呼び出すため
「View.generateViewId();」を使用してIdを各コントロールに設定してます。
ボタンをクリックしたらボタンに設定したタグから「C」(クリアボタン)かどうか?を
判定しています。
ボタンに設定しているタグとは次の例のようになります。
(例)
btn.setTag(idx);//このサンプルでは判定用として使用しています。
数字のボタンをタップしたケース
このサンプルでは簡易的に一度文字列にしてから数字に戻した内容を
テキストに設定しています。
これは前ゼロを防ぐためです。
[×]0123
[○]123
※左にゼロは通常つけないため。
このサンプルではInteger型の桁数を考慮し9桁を限度としています。
クリアボタンの場合はテキストを空文字に設定することで
クリア処理を実現させています。
実行結果
|
|