--- /dev/null
+*.iml
+.gradle
+.idea
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures
+/app/build
+.externalNativeBuild
+/gradle
+import-summary.txt
+gradlew
+gradlew.bat
--- /dev/null
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 28
+ buildToolsVersion "28.0.0"
+
+ defaultConfig {
+ applicationId "jp.sourceforge.gokigen.warikan"
+ minSdkVersion 2
+ targetSdkVersion 28
+ versionCode 4
+ versionName "1.0.4"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
+ }
+ }
+}
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="jp.sourceforge.gokigen.warikan">
+ <application android:icon="@drawable/icon" android:label="@string/app_name">
+ <activity android:name=".TheWarikan"
+ android:label="@string/app_name">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ <activity android:name=".InputTenKey"
+ android:label="@string/name_tenKey">
+ <intent-filter>
+ <action android:name="android.intent.action.EDIT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
\ No newline at end of file
--- /dev/null
+package jp.sourceforge.gokigen.warikan;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.Window;
+import android.view.KeyEvent;
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.EditText;
+import android.content.Intent;
+
+
+/**
+ * テンキー入力画面
+ * startActivityForResult()で呼ばれることを前提とし、入力値をResultで返す。
+ * エラーまたは入力キャンセルの場合には、Activity.RESULT_OK (-1) を応答する。
+ *
+ * ※ 処理はイベントリスナ側で行うので、このクラスでは大した処理は行わない。
+ *
+ * @author MRSa
+ *
+ */
+public class InputTenKey extends Activity
+{
+ static public final String INPUT_INFORMATION = "net.cornn.warikan.InputGuidance";
+ static public final String INITIAL_VALUE = "net.cornn.warikan.InputDefaultValue";
+ static public final int NO_INFORMATION_MESSAGE = -1;
+
+ public TenKeyListener listener = null;
+
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ setContentView(R.layout.tenkey);
+
+ // イベントリスナとオブジェクト(ボタン)のリンク
+ listener = new TenKeyListener(this);
+ final Button cancelButton = findViewById(R.id.button_Cancel);
+ final Button okButton = findViewById(R.id.button_Enter);
+ final Button zeroButton = findViewById(R.id.button_Zero);
+ final Button oneButton = findViewById(R.id.button_One);
+ final Button twoButton = findViewById(R.id.button_Two);
+ final Button threeButton = findViewById(R.id.button_Three);
+ final Button fourButton = findViewById(R.id.button_Four);
+ final Button fiveButton = findViewById(R.id.button_Five);
+ final Button sixButton = findViewById(R.id.button_Six);
+ final Button sevenButton = findViewById(R.id.button_Seven);
+ final Button eightButton = findViewById(R.id.button_Eight);
+ final Button nineButton = findViewById(R.id.button_Nine);
+ final Button clearButton = findViewById(R.id.button_Clear);
+ final Button zero2Button = findViewById(R.id.button_ZeroZero);
+ final EditText fieldArea = findViewById(R.id.numericData);
+
+
+ // ボタンとそれぞれイベントリスナをつなぐ!
+ okButton.setOnClickListener(listener);
+ cancelButton.setOnClickListener(listener);
+ clearButton.setOnClickListener(listener);
+ zeroButton.setOnClickListener(listener);
+ oneButton.setOnClickListener(listener);
+ twoButton.setOnClickListener(listener);
+ threeButton.setOnClickListener(listener);
+ fourButton.setOnClickListener(listener);
+ fiveButton.setOnClickListener(listener);
+ sixButton.setOnClickListener(listener);
+ sevenButton.setOnClickListener(listener);
+ eightButton.setOnClickListener(listener);
+ nineButton.setOnClickListener(listener);
+ zero2Button.setOnClickListener(listener);
+
+ fieldArea.setOnKeyListener(listener);
+ }
+
+ /**
+ * 画面が裏に回ったときの処理
+ */
+ @Override
+ public void onPause()
+ {
+ super.onPause();
+ }
+
+ /**
+ * 画面が表に出てきたときの処理
+ * (入力ガイドメッセージと初期値を設定する)
+ */
+ @Override
+ public void onResume()
+ {
+ super.onResume();
+
+ try
+ {
+ // ガイドメッセージの表示
+ String message = "";
+ Intent intent = getIntent();
+ int dummy = NO_INFORMATION_MESSAGE;
+ int resId = intent.getIntExtra(INPUT_INFORMATION, dummy);
+ if (resId != NO_INFORMATION_MESSAGE)
+ {
+ message = getString(resId);
+ }
+ TextView messageArea = findViewById(R.id.tenKeyMessage);
+ messageArea.setText(message.toCharArray(), 0, message.length());
+
+ // 初期値の表示
+ int initialValue = intent.getIntExtra(INITIAL_VALUE, dummy);
+ if (initialValue > 0)
+ {
+ message = "" + initialValue;
+ EditText valueArea = findViewById(R.id.numericData);
+ valueArea.setText(message.toCharArray(), 0, message.length());
+ valueArea.setSelection(message.length());
+ }
+ }
+ catch (Exception ex)
+ {
+ // なんもしない...
+ }
+ }
+
+ /**
+ * キー入力されたとき...
+ */
+ public boolean onKeyDown(int keyCode, KeyEvent event)
+ {
+ try
+ {
+ // delegateして処理を継続する。
+ return (listener.onKeyDown(keyCode, event));
+ }
+ catch (Exception ex)
+ {
+ //
+ }
+ return (false);
+ }
+}
--- /dev/null
+package jp.sourceforge.gokigen.warikan;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.CompoundButton;
+import android.widget.TextView;
+import android.widget.CompoundButton.OnCheckedChangeListener;
+
+/**
+ * メイン画面のイベントを処理するクラス
+ * @author MRSa
+ *
+ */
+public class MainScreenListener implements OnClickListener, OnCheckedChangeListener
+{
+ private Activity parent; // 親分
+ private MainScreenUpdater updater; // 子分
+
+ /**
+ * コンストラクタ
+ * @param argument 呼び出しもと(Activityクラス)
+ */
+ MainScreenListener(Activity argument, MainScreenUpdater screenUpdater)
+ {
+ super();
+ parent = argument;
+ updater = screenUpdater;
+ }
+
+ /**
+ * ボタンが押されたときの処理
+ */
+ public void onClick(View v)
+ {
+ showTenKey(v.getId());
+ }
+
+ /**
+ * チェックボックスが変更となったときの処理
+ * (OFF ⇒ ONのときにはテンキーを表示する)
+ */
+ public void onCheckedChanged(CompoundButton v, boolean isChecked)
+ {
+ int id = v.getId();
+ if (!isChecked)
+ {
+ // チェックがクリアされたときの処理
+ updater.clearedCheckBox(id);
+ }
+ else if (id == R.id.chkAddCharge)
+ {
+ // 『チップ加算』のチェックがついたときの処理
+ showTenKey(id);
+ }
+ }
+
+ /**
+ * テンキー画面を表示する処理
+ * @param buttonId 表示するトリガとなったオブジェクトのID
+ */
+ private void showTenKey(int buttonId)
+ {
+ try
+ {
+ // 編集指示を送ることで、テンキーを呼び出してみる
+ int resId = decideInformationMessageId(buttonId);
+ int initialValue = decideInitialValue(buttonId);
+ Intent editIntent = new Intent(parent, jp.sourceforge.gokigen.warikan.InputTenKey.class);
+ editIntent.putExtra(InputTenKey.INPUT_INFORMATION, resId);
+ editIntent.putExtra(InputTenKey.INITIAL_VALUE, initialValue);
+ parent.startActivityForResult(editIntent, buttonId);
+ }
+ catch (Exception e)
+ {
+ // 例外発生...なにもしない。
+ }
+ }
+
+ /**
+ * 入力されたボタンに対応したリソース(表示すべきメッセージ)のリソースIDを応答する
+ *
+ */
+ private int decideInformationMessageId(int buttonId)
+ {
+ int resId = InputTenKey.NO_INFORMATION_MESSAGE;
+
+ // 支払い金額を入力する場合...
+ if (buttonId == R.id.totalPaymentData)
+ {
+ resId = R.string.payment_Message;
+ return (resId);
+ }
+
+ // 『チップ加算』で加算する場合...
+ if (buttonId == R.id.chkAddCharge)
+ {
+ resId = R.string.serviceCharge_Message;
+ return (resId);
+ }
+
+ // 『スポンサー』の人数を入力する場合...
+ if (buttonId == R.id.numberOfGentlemen)
+ {
+ resId = R.string.numberOfGentlemen_Message;
+ return (resId);
+ }
+
+ // 『男性』の人数を入力する場合...
+ if (buttonId == R.id.numberOfMen)
+ {
+ resId = R.string.numberOfMen_Message;
+ return (resId);
+ }
+
+ // 『女性』の人数を入力する場合...
+ if (buttonId == R.id.numberOfWomen)
+ {
+ resId = R.string.numberOfWomen_Message;
+ return (resId);
+ }
+
+ // 『スポンサー』の支払額を変更する場合...
+ if (buttonId == R.id.GentlemenMoney)
+ {
+ resId = R.string.paymentGentlemen_Message;
+ return (resId);
+ }
+
+ // 『男性』の支払額を変更する場合...
+ if (buttonId == R.id.MenMoney)
+ {
+ resId = R.string.paymentMen_Message;
+ return (resId);
+ }
+
+ // 『女性』の支払額を変更する場合...
+ if (buttonId == R.id.WomenMoney)
+ {
+ resId = R.string.paymentWomen_Message;
+ return (resId);
+ }
+ return (resId);
+ }
+
+ /**
+ * 入力されたボタンに対応した初期データ値を応答する
+ *
+ */
+ private int decideInitialValue(int buttonId)
+ {
+ int value = 0;
+
+ try
+ {
+ // 『チップ加算』で加算する場合...
+ if (buttonId == R.id.chkAddCharge)
+ {
+ // とりあえず、直値で15を指定しておこう
+ value = 15;
+ return (value);
+ }
+
+ // 支払い金額 or 人数を入力する場合...
+ if ((buttonId == R.id.totalPaymentData)||
+ (buttonId == R.id.numberOfGentlemen)||
+ (buttonId == R.id.numberOfMen)||
+ (buttonId == R.id.numberOfWomen)||
+ (buttonId == R.id.GentlemenMoney)||
+ (buttonId == R.id.MenMoney)||
+ (buttonId == R.id.WomenMoney))
+ {
+ // 現在設定されている値を取り出して初期値にする
+ TextView area = parent.findViewById(buttonId);
+ value = Integer.valueOf(area.getText().toString());
+ return (value);
+ }
+ }
+ catch (Exception ex)
+ {
+ value = 0;
+ }
+ return (value);
+ }
+}
--- /dev/null
+package jp.sourceforge.gokigen.warikan;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.util.Log;
+import android.widget.CheckBox;
+import android.widget.TextView;
+import android.widget.Toast;
+
+/**
+ * メイン画面の表示を更新する人
+ * @author MRSa
+ *
+ */
+public class MainScreenUpdater
+{
+ private final String TAG = toString();
+ private Activity parent;
+ private int totalValue = 0;
+
+ /**
+ * コンストラクタ
+ *
+ */
+ MainScreenUpdater(Activity argument)
+ {
+ super();
+ parent = argument;
+ }
+
+ /**
+ * 画面表示の更新
+ */
+ public void updateScreen()
+ {
+ //
+ }
+
+ /**
+ * 表示データの更新指示を受信した!
+ *
+ */
+ public void onActivityResult(int requestCode, int resultCode, Intent data)
+ {
+ if (resultCode < 0)
+ {
+ // 指定された値が負なら、なにもしない (異常値)
+ Log.v(TAG,"" + data.getAction());
+ return;
+ }
+
+ boolean needCalculate = false;
+ String stringData = "";
+ switch (requestCode)
+ {
+ case R.id.totalPaymentData:
+ // 支払い総額の変更処理
+ needCalculate = setPaymentValue(resultCode);
+ break;
+
+ case R.id.chkAddCharge:
+ // チップ加算をした支払い総額の変更処理
+ updateTotalValueWithServiceCharge(resultCode);
+ showTotalPaymentData();
+ needCalculate = true;
+ break;
+
+ case R.id.numberOfGentlemen:
+ case R.id.numberOfMen:
+ case R.id.numberOfWomen:
+ // 値を設定する
+ stringData = stringData + resultCode;
+ setValueToTextView(requestCode, stringData);
+ needCalculate = true;
+ break;
+
+ case R.id.GentlemenMoney:
+ case R.id.MenMoney:
+ case R.id.WomenMoney:
+ // 支払額が補正された場合...
+ modifyPayment(requestCode, resultCode);
+ needCalculate = false;
+ break;
+
+ default:
+ // do nothing!
+ break;
+ }
+ if (needCalculate)
+ {
+ // わりかん計算を行い、画面表示を更新する。
+ calculatePayment();
+ }
+ }
+
+ /**
+ * チェックボックスがクリアされたときの処理
+ *
+ *
+ */
+ public void clearedCheckBox(int id)
+ {
+ if (id == R.id.chkAddCharge)
+ {
+ // チップ加算のチェックがはずされた!
+ clearAddChargeCheckBox();
+ }
+ }
+
+ /**
+ * TextViewにString型の値を設定する
+ *
+ */
+ private void setValueToTextView(int id, String stringData)
+ {
+ try
+ {
+ TextView view = parent.findViewById(id);
+ view.setText(stringData.toCharArray(), 0, stringData.length());
+ }
+ catch (Exception ex)
+ {
+ //
+ }
+ }
+
+ /**
+ * TextViewから整数型の値を取得する
+ *
+ */
+ private int getIntValueFromTextView(int id)
+ {
+ int value = Integer.MIN_VALUE;
+ try
+ {
+ TextView view =parent.findViewById(id);
+ value = Integer.valueOf(view.getText().toString());
+ }
+ catch (Exception ex)
+ {
+ //
+ }
+ return (value);
+ }
+
+ /**
+ * 『チップ加算』のチェックがはずされたときの処理
+ */
+ private void clearAddChargeCheckBox()
+ {
+ try
+ {
+ // チェックがはずされたときの処理
+ String data = "";
+ setValueToTextView(R.id.serviceCharge, data);
+
+ // 支払い総額を更新する (チップ加算をはずす)
+ totalValue = getIntValueFromTextView(R.id.totalPaymentData);
+ if (totalValue < 0)
+ {
+ totalValue = 0;
+ }
+ // メッセージの表示
+ showTotalPaymentData();
+
+ // 金額の再計算を行い、画面を再表示する
+ calculatePayment();
+ }
+ catch (Exception ex)
+ {
+ //
+ }
+ }
+
+ /**
+ * 支払い金額を設定する
+ *
+ */
+ private boolean setPaymentValue(int value)
+ {
+ boolean isUpdated = false;
+ try
+ {
+ // 設定された値を「支払金額」欄に表示する
+ String data = "" + value;
+ setValueToTextView(R.id.totalPaymentData, data);
+
+ // 支払い総額を設定する
+ totalValue = value;
+
+ // 支払い総額が変更になったときは、「チップ加算」はクリアする
+ // (チェックボックスの状態更新イベントで、表示データは消す)
+ CheckBox chargeCheck = parent.findViewById(R.id.chkAddCharge);
+ if (!chargeCheck.isChecked())
+ {
+ // チェックボックスがついていない...再計算する
+ isUpdated = true;
+
+ // 「チップ加算」の領域に表示しているデータを消去する(保険)
+ data = "";
+ setValueToTextView(R.id.serviceCharge, data);
+
+ // 合計金額を表示
+ showTotalPaymentData();
+ }
+ else
+ {
+ // チェックボックスの状態変化イベント受信時に再計算する
+ chargeCheck.setChecked(false);
+ }
+ }
+ catch (Exception ex)
+ {
+ //
+ }
+ return (isUpdated);
+ }
+
+ /**
+ * チップを含んだ支払総額を計算し、画面表示を更新する
+ *
+ *
+ */
+ private void updateTotalValueWithServiceCharge(int value)
+ {
+ String outputData;
+ try
+ {
+ // チップの割合を計算し、支払い総額を求める。
+ String unit = parent.getString(R.string.Yen);
+ outputData = value + " % ";
+ int payment = getIntValueFromTextView(R.id.totalPaymentData);
+ if (payment < 0)
+ {
+ totalValue = 0;
+ }
+ totalValue = payment * value;
+ totalValue = totalValue / 100;
+ totalValue = totalValue + payment;
+
+ // 支払総額を画面表示
+ outputData = outputData + "(" + totalValue + unit + " )";
+ setValueToTextView(R.id.serviceCharge, outputData);
+ }
+ catch (Exception ex)
+ {
+ //
+ }
+ }
+
+ /**
+ * 支払い額が変わったので、それぞれの支払額を補正してから、表示する
+ *
+ * @param id 支払額を変更した箇所
+ * @param value 支払額の変更後の値
+ */
+ private void modifyPayment(int id, int value)
+ {
+ try
+ {
+ int nofGentlemen = getIntValueFromTextView(R.id.numberOfGentlemen);
+ int nofMen = getIntValueFromTextView(R.id.numberOfMen);
+ int nofWomen = getIntValueFromTextView(R.id.numberOfWomen);
+
+ if ((nofGentlemen == 0)&&(nofMen == 0)&&(nofWomen == 0))
+ {
+ // 人数がゼロ人...計算せずに終了する (ありえないはず)
+ return;
+ }
+
+ int gentlemen = getIntValueFromTextView(R.id.GentlemenMoney);
+ int men = getIntValueFromTextView(R.id.MenMoney);
+ int women = getIntValueFromTextView(R.id.WomenMoney);
+
+ int restValue;
+ if (id == R.id.WomenMoney)
+ {
+ // 女性の金額が変更となった場合...
+ if (((value - men) <= 300)&&((value - men) >= -300))
+ {
+ // Menと Womenの支払い額が誤差範囲に入った場合...500円単位の割り勘にする
+ restValue = totalValue - nofGentlemen * gentlemen;
+
+ men = calculateSingleCategory((nofMen + nofWomen), restValue, 500);
+ women = men;
+ updatePayment(nofGentlemen, gentlemen, nofMen, men, nofWomen, women);
+ }
+ else
+ {
+ // 女性の金額を入力した値に置き換える
+ women = value;
+ int paymentValue = totalValue - women * nofWomen;
+
+ // スポンサーの支払い額を決定する
+ gentlemen = calculateGentlemen(paymentValue, nofGentlemen, nofMen, 0);
+
+ // 男性の支払額を計算する (100円単位で)
+ restValue = paymentValue - nofGentlemen * gentlemen;
+ men = calculateSingleCategory(nofMen, restValue, 100);
+ if ((nofMen > 0)&&(men < 1000)&&(nofWomen > 0))
+ {
+ // 男性のほうが支払い金額が少なくなる場合... 500円単位での男女同額の割り勘とする
+ restValue = paymentValue - gentlemen * nofGentlemen;
+ men = calculateSingleCategory((nofMen + nofWomen), restValue, 500);
+ women = men;
+ }
+
+ // 支払い結果を表示する
+ updatePayment(nofGentlemen, gentlemen, nofMen, men, nofWomen, women);
+ }
+ return;
+ }
+ if (id == R.id.GentlemenMoney)
+ {
+ // スポンサーの金額を変更しようとしたとき、本当に変更するか、確認を求める。
+ if (!confirmToChangeGentlemenPayment(nofGentlemen, gentlemen, value))
+ {
+ // 支払い額の変更を中止する
+ return;
+ }
+
+ // スポンサーの金額を入力した値に置き換える
+ gentlemen = value;
+ restValue = totalValue - gentlemen * nofGentlemen;
+ if (restValue <= 0)
+ {
+ // 支払額が決定した... リターンする
+ updatePayment(nofGentlemen, gentlemen, nofMen, men, nofWomen, women);
+ return;
+ }
+
+ // 女性の支払い金額を計算する
+ women = calculateWomen(restValue, nofGentlemen, nofMen, nofWomen);
+
+ // 男性の支払額を計算する (500円単位で)
+ restValue = restValue - nofWomen * women;
+ men = calculateSingleCategory(nofMen, restValue, 500);
+ if ((nofMen > 0)&&(men < 1000)&&(nofWomen > 0))
+ {
+ // 男性のほうが金額が少なくなる場合... 500円単位での男女同額の割り勘とする
+ restValue = totalValue - gentlemen * nofGentlemen;
+ men = calculateSingleCategory((nofMen + nofWomen), restValue, 500);
+ women = men;
+ }
+ // 支払額が決定した... リターンする
+ updatePayment(nofGentlemen, gentlemen, nofMen, men, nofWomen, women);
+ return;
+ }
+
+ if (id == R.id.MenMoney)
+ {
+ // 男性の金額を変更したとき、本当に変更するか、確認を求める。
+ boolean check = confirmToChangeMenPayment(nofGentlemen, gentlemen, value);
+ if (check)
+ {
+ // 支払い額の変更を中止する
+ return;
+ }
+
+ // 男性の支払額を変更する
+ men = value;
+ restValue = totalValue - gentlemen * nofGentlemen - men * nofMen;
+ if (restValue > 0)
+ {
+ // 女性の支払い金額を計算する
+ women = calculateSingleCategory(nofWomen, restValue, 1000);
+ }
+
+ // 支払額が決定した... リターンする
+ updatePayment(nofGentlemen, gentlemen, nofMen, men, nofWomen, women);
+ }
+ }
+ catch (Exception ex)
+ {
+ //
+ }
+ }
+
+ /**
+ * 人数と支払い総額から、それぞれの支払い額を計算し、表示する
+ */
+ private void calculatePayment()
+ {
+ if (totalValue <= 0)
+ {
+ // 総額が入力されていなかったので、なにもせずに終了する
+ return;
+ }
+
+ try
+ {
+ // それぞれの人数を取得する
+ int nofGentlemen = getIntValueFromTextView(R.id.numberOfGentlemen);
+ int nofMen = getIntValueFromTextView(R.id.numberOfMen);
+ int nofWomen = getIntValueFromTextView(R.id.numberOfWomen);
+
+ if ((nofGentlemen <= 0)&&(nofMen <= 0)&&(nofWomen <= 0))
+ {
+ // 人数がゼロ人...計算せずに終了する
+ updatePayment(0, 0, 0, 0, 0, 0);
+ return;
+ }
+
+ // 各グループごとの支払い金額を求める
+ int gentlemen = 0;
+ int men = 0;
+ int women = 0;
+
+ // ひとつのグループの場合の処理...
+ if ((nofMen == 0)&&(nofWomen == 0))
+ {
+ // スポンサーだけの場合...1円単位できっちり割り勘
+ gentlemen = calculateSingleCategory(nofGentlemen, totalValue, 1);
+ updatePayment(nofGentlemen, gentlemen, nofMen, men, nofWomen, women);
+ return;
+ }
+ if ((nofGentlemen == 0)&&(nofWomen == 0))
+ {
+ // 男性だけの場合...100円単位の割り勘
+ men = calculateSingleCategory(nofMen, totalValue, 100);
+ updatePayment(nofGentlemen, gentlemen, nofMen, men, nofWomen, women);
+ return;
+ }
+ if ((nofGentlemen == 0)&&(nofMen == 0))
+ {
+ // 女性だけの場合...10円単位での割り勘
+ women = calculateSingleCategory(nofWomen, totalValue, 10);
+ updatePayment(nofGentlemen, gentlemen, nofMen, men, nofWomen, women);
+ return;
+ }
+
+ // 割り勘演算ロジック... 結構むちゃくちゃかも。。。
+
+ // スポンサーの支払い額を決定する
+ gentlemen = calculateGentlemen(totalValue, nofGentlemen, nofMen, nofWomen);
+
+ // 残り金額を男性と女性でわりかん
+ int restValue = totalValue - gentlemen * nofGentlemen;
+ if (restValue <= 0)
+ {
+ // 支払額が決定した... リターンする
+ updatePayment(nofGentlemen, gentlemen, nofMen, men, nofWomen, women);
+ return;
+ }
+
+ // 残り金額が 男性の人数×1000円より小さければ、女性は払わない
+ women = calculateWomen(restValue, nofGentlemen, nofMen, nofWomen);
+
+ // 男性の支払額を計算する (500円単位で)
+ restValue = restValue - nofWomen * women;
+ men = calculateSingleCategory(nofMen, restValue, 500);
+ if ((nofMen > 0)&&(men < 1000)&&(nofWomen > 0))
+ {
+ // 男性のほうが金額が少なくなる場合... 500円単位での男女同額の割り勘とする
+ restValue = totalValue - gentlemen * nofGentlemen;
+ men = calculateSingleCategory((nofMen + nofWomen), restValue, 500);
+ women = men;
+ }
+
+ if ((nofMen > 0)&&(men > gentlemen)&&(nofGentlemen > 0))
+ {
+ // 男性の金額がスポンサーの金額を上回る場合...スポンサーの金額を加算して再計算
+ gentlemen = gentlemen + 5000; // 5000円を加算
+ restValue = totalValue - gentlemen * nofGentlemen - women * nofWomen;
+ men = calculateSingleCategory(nofMen, restValue, 500);
+ if ((men < 1000)&&(nofWomen > 0))
+ {
+ // 再計算後、男性のほうが金額が少なくなる場合... 500円単位での男女同額の割り勘とする
+ restValue = totalValue - gentlemen * nofGentlemen;
+ men = calculateSingleCategory((nofMen + nofWomen), restValue, 500);
+ women = men;
+ }
+ }
+
+ // 支払い結果を表示する
+ updatePayment(nofGentlemen, gentlemen, nofMen, men, nofWomen, women);
+ }
+ catch (Exception ex)
+ {
+ //
+ }
+ }
+
+
+ /**
+ * スポンサーの支払額を決定する
+ * @param payment 支払う必要のある額
+ * @param nofGentlemen スポンサーの人数
+ * @param nofMen 男性の人数
+ * @param nofWomen 女性の人数
+ */
+ private int calculateGentlemen(int payment, int nofGentlemen, int nofMen, int nofWomen)
+ {
+ if (nofGentlemen == 0)
+ {
+ return (0);
+ }
+
+ int totalPerson = nofGentlemen + nofMen + nofWomen;
+ int gentlemen;
+ int percentage = (nofGentlemen * 100) / totalPerson;
+ if (percentage > 60)
+ {
+ // スポンサー比率が 60%を超えた場合には、スポンサーだけで割り勘する
+ gentlemen = calculateSingleCategory(nofGentlemen, payment, 1000);
+ //updatePayment(nofGentlemen, gentlemen, nofMen, 0, nofWomen, 0);
+ return (gentlemen);
+ }
+
+ int value;
+ if (percentage > 30)
+ {
+ // スポンサーの割合が 30% を超えていた場合には、スポンサーが2/3を支払う
+ value = payment * 2 / 3;
+ gentlemen = calculateSingleCategory(nofGentlemen, value, 1000);
+ }
+ else
+ {
+ // スポンサーの割合が 30% よりも小さい場合には、10000円以上、5000円単位で支払う
+ value = payment * (percentage * 2) / 100;
+ if ((value / nofGentlemen) > 10000)
+ {
+ gentlemen = calculateSingleCategory(nofGentlemen, value, 5000);
+ }
+ else
+ {
+ gentlemen = 10000; // 基本は10000円!
+ }
+ }
+ return (gentlemen);
+ }
+
+ /**
+ * 女性の支払額を決定する
+ *
+ *
+ */
+ private int calculateWomen(int restValue, int nofGentlemen, int nofMen, int nofWomen)
+ {
+ int women = 0;
+ if (restValue > nofMen * 1000)
+ {
+ // 女性は3分の1程度を支払う (1000円単位で、参加人数比も加味して計算)
+ int percentage = nofWomen * 100 / (nofWomen + nofMen + nofGentlemen);
+ int value = restValue * percentage / 300;
+ women = calculateSingleCategory(nofWomen, value, 1000);
+ }
+ return (women);
+ }
+
+
+ /**
+ * 金額の表示
+ * @param nofGentlemen スポンサーの人数
+ * @param gentlemen スポンサーの金額
+ * @param nofMen 男性の人数
+ * @param men 男性の金額
+ * @param nofWomen 女性の人数
+ * @param women 女性の金額
+ */
+ private void updatePayment(int nofGentlemen, int gentlemen, int nofMen, int men, int nofWomen, int women)
+ {
+ // スポンサーの金額表示
+ String data = "" + gentlemen;
+ setValueToTextView(R.id.GentlemenMoney, data);
+
+ // 男性の金額表示
+ data = "" + men;
+ setValueToTextView(R.id.MenMoney, data);
+
+ // 女性の金額表示
+ data = "" + women;
+ setValueToTextView(R.id.WomenMoney, data);
+
+ // 総額の金額表示
+ int total = gentlemen * nofGentlemen + men * nofMen + women * nofWomen;
+ data = "" + total;
+ setValueToTextView(R.id.totalAmountValue, data);
+
+ // あまりの金額
+ int mod = total - totalValue;
+ if (mod > 0)
+ {
+ // あまりがあれば表示する
+ data = parent.getString(R.string.modStart) + mod + parent.getString(R.string.modEnd);
+ setValueToTextView(R.id.additionalInfoTotalAmount, data);
+ }
+ else
+ {
+ // あまりの表示領域をクリアする
+ data = "";
+ setValueToTextView(R.id.additionalInfoTotalAmount, data);
+ }
+
+ if ((nofGentlemen > 0)||(nofMen > 0)||(nofWomen > 0))
+ {
+ // 「計算しました」メッセージを表示する
+ showMessage(parent.getString(R.string.info_updatePayment));
+ }
+ }
+
+ /**
+ * 支払い額を指定された単位で切り上げて割り勘する
+ * @param person 人数
+ * @param payment 支払い総額
+ * @param unit 丸める単位
+ *
+ */
+ private int calculateSingleCategory(int person, int payment, int unit)
+ {
+ // いちおう、保険でガードをかける
+ if ((person <= 0)||(payment < 0))
+ {
+ return (0);
+ }
+
+ // MEMO: 割り算したときの小数点部分をあまらさないようにする
+ // (この処理はいらない...かも?)
+ int value = payment * 100 / person; // 10倍した値を計算
+ int modular = value % 100;
+ if (modular > 0)
+ {
+ value = value + (100 - modular); // 桁あがりさせる
+ }
+ value = value / 100;
+
+ // 計算結果を指定された単位でまるめる(桁上げする)
+ if (unit <= 0)
+ {
+ unit = 1;
+ }
+ modular = value % unit;
+ if (modular > 0)
+ {
+ value = value + (unit - modular); // 桁あがりする
+ }
+ return (value);
+ }
+
+ /**
+ * スポンサーの支払い金額を変更するとき、本当に変更するか確認を行う処理
+ * @param number スポンサーの人数
+ * @param current 現在の支払い金額
+ * @param change 変更する支払い金額
+ * @return true:変更許可 , false:変更中止
+ */
+ private boolean confirmToChangeGentlemenPayment(int number, int current, int change)
+ {
+ Log.v(TAG, "confirmToChangeGentlemenPayment() " + number + " " + current + " " + change);
+ return (true); // 変更を許可する
+ }
+
+ /**
+ * 男性の支払い金額を変更するとき、本当に変更するか確認を行う処理
+ * @param number 男性の人数
+ * @param current 現在の支払い金額
+ * @param change 変更する支払い金額
+ * @return true:変更許可 , false:変更中止
+ */
+ private boolean confirmToChangeMenPayment(int number, int current, int change)
+ {
+ Log.v(TAG, "confirmToChangeMenPayment() " + number + " " + current + " " + change);
+ return (true); // 変更を許可する
+ }
+
+ /**
+ * 支払い金額をメッセージ表示する
+ */
+ private void showTotalPaymentData()
+ {
+ String outputData = parent.getString(R.string.info_payment);
+ outputData = outputData + totalValue + parent.getString(R.string.Yen);
+ outputData = outputData + parent.getString(R.string.info_postfix);
+ showMessage(outputData);
+ }
+
+ /**
+ * メッセージを表示する
+ * @param outputData 表示するメッセージ
+ */
+ private void showMessage(String outputData)
+ {
+ // もわっとメッセージを表示する
+ Toast.makeText(parent, outputData, Toast.LENGTH_SHORT).show();
+ }
+}
--- /dev/null
+package jp.sourceforge.gokigen.warikan;
+
+import android.app.Activity;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.View.OnKeyListener;
+import android.widget.EditText;
+
+/**
+ * テンキーのイベントリスナ
+ * @author MRSa
+ *
+ */
+public class TenKeyListener implements OnClickListener, OnKeyListener
+{
+ private final String TAG = toString();
+ private Activity parent;
+ private static final int MAX_INPUT_LENGTH = 7; // 七桁以上のデータは入力できない
+
+ /**
+ * コンストラクタ...親分だけはおぼえておく。
+ *
+ */
+ TenKeyListener(Activity argument)
+ {
+ super();
+ parent = argument;
+ }
+
+ /**
+ * ボタンが押されたときの処理
+ */
+ public void onClick(View v)
+ {
+ int btnId = v.getId();
+
+ // OKボタンが押されたときの処理
+ if (btnId == R.id.button_Enter)
+ {
+ // データが入力された、、、ので値を応答して終了する
+ finishInput();
+ return;
+ }
+
+ // Cancelボタンが押されたときの処理
+ if (btnId == R.id.button_Cancel)
+ {
+ // データの入力をキャンセルする
+ cancelInput();
+ return;
+ }
+
+ // CLRボタンが押されたときのしょり
+ if (btnId == R.id.button_Clear)
+ {
+ // 入力した値をクリアする
+ clearEntryValue();
+ return;
+ }
+
+ // 以降、数字ボタン(0~9)が押されたときの処理
+ if (btnId == R.id.button_Zero)
+ {
+ entryValue(0); // 0ボタン
+ return;
+ }
+ if (btnId == R.id.button_One)
+ {
+ entryValue(1); // 1ボタン
+ return;
+ }
+ if (btnId == R.id.button_Two)
+ {
+ entryValue(2); // 2ボタン
+ return;
+ }
+ if (btnId == R.id.button_Three)
+ {
+ entryValue(3); // 3ボタン
+ return;
+ }
+ if (btnId == R.id.button_Four)
+ {
+ entryValue(4); // 4ボタン
+ return;
+ }
+ if (btnId == R.id.button_Five)
+ {
+ entryValue(5); // 5ボタン
+ return;
+ }
+ if (btnId == R.id.button_Six)
+ {
+ entryValue(6); // 6ボタン
+ return;
+ }
+ if (btnId == R.id.button_Seven)
+ {
+ entryValue(7); // 7ボタン
+ return;
+ }
+ if (btnId == R.id.button_Eight)
+ {
+ entryValue(8); // 8ボタン
+ return;
+ }
+ if (btnId == R.id.button_Nine)
+ {
+ entryValue(9); // 9ボタン
+ return;
+ }
+ if (btnId == R.id.button_ZeroZero)
+ {
+ // 00ボタン...0を2回入力したことにする
+ entryValue(0);
+ entryValue(0);
+ }
+ }
+
+ /**
+ * キー入力
+ */
+ public boolean onKey(View v, int keyCode, KeyEvent event)
+ {
+ return (onKeyDown(keyCode, event));
+ }
+
+ /**
+ * 入力値を確定してダイアログを抜ける
+ */
+ private void finishInput()
+ {
+ exitTenKeyWithValue();
+ parent.finish();
+ }
+
+ /**
+ * 入力をキャンセルしてダイアログを抜ける
+ */
+ private void cancelInput()
+ {
+ // 値を入れずに終了させる
+ parent.setResult(Activity.RESULT_OK);
+ parent.finish();
+ }
+
+ /**
+ * 値を加算する
+ * @param data 入力した数値
+ */
+ private void entryValue(int data)
+ {
+ try
+ {
+ EditText valueField = parent.findViewById(R.id.numericData);
+ String value = valueField.getText().toString();
+ if (value.length() >= MAX_INPUT_LENGTH)
+ {
+ // 入力可能な文字数をオーバーしているので、何もしない
+ return;
+ }
+ // データを(文字列に変更して)入力する
+ value = value + data;
+ valueField.setText(value.toCharArray(), 0, value.length());
+ valueField.setSelection(value.length());
+ }
+ catch (Exception ex)
+ {
+ //
+ }
+ }
+
+ /**
+ * 入力フィールドをクリアする
+ */
+ private void clearEntryValue()
+ {
+ try
+ {
+ String value = "";
+ EditText valueField = parent.findViewById(R.id.numericData);
+ valueField.setText(value.toCharArray(), 0, value.length());
+ valueField.setSelection(value.length());
+ }
+ catch (Exception ex)
+ {
+ // なにもしない
+ }
+ }
+
+ /**
+ * 入力された値を応答コードとして詰める。
+ * (エラー発生時には、RESULT_OK (-1) を格納する。)
+ */
+ private void exitTenKeyWithValue()
+ {
+ EditText valueField;
+ try
+ {
+ // 画面の数値入力フィールドから値を取得し、数値に変換して応答する
+ valueField = parent.findViewById(R.id.numericData);
+ String value = valueField.getText().toString();
+ if (value.length() == 0)
+ {
+ // 値が入力されていないときには、ゼロにする
+ parent.setResult(0);
+ return;
+ }
+ int intValue = Integer.valueOf(value);
+ parent.setResult(intValue);
+ }
+ catch (Exception e)
+ {
+ // 値をいれずに終了させる
+ parent.setResult(Activity.RESULT_OK);
+ }
+ }
+
+ /**
+ * テンキーのキー入力
+ *
+ *
+ */
+ public boolean onKeyDown(int keyCode, KeyEvent event)
+ {
+ Log.v(TAG, "KEY DOWN : " + event.getDeviceId());
+
+ if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER)||
+ (keyCode == KeyEvent.KEYCODE_ENTER))
+ {
+ // センターボタン、Enter、データ入力を確定させる。
+ finishInput();
+ return (true);
+ }
+ if ((keyCode == KeyEvent.KEYCODE_CLEAR))
+ {
+ // クリアボタン、、、入力をクリアする
+ clearEntryValue();
+ return (true);
+ }
+ if ((keyCode == KeyEvent.KEYCODE_BACK))
+ {
+ // バックボタン、、、入力をキャンセルする
+ cancelInput();
+ return (true);
+ }
+/*
+ else if ((keyCode == KeyEvent.KEYCODE_0))
+ {
+ // 数字キーのゼロを入力
+ entryValue(0);
+ }
+ else if ((keyCode == KeyEvent.KEYCODE_1))
+ {
+ // 数字キーの1を入力
+ entryValue(1);
+ }
+ else if ((keyCode == KeyEvent.KEYCODE_2))
+ {
+ // 数字キーの2を入力
+ entryValue(2);
+ }
+ else if ((keyCode == KeyEvent.KEYCODE_3))
+ {
+ // 数字キーの3を入力
+ entryValue(3);
+ }
+ else if ((keyCode == KeyEvent.KEYCODE_4))
+ {
+ // 数字キーの4を入力
+ entryValue(4);
+ }
+ else if ((keyCode == KeyEvent.KEYCODE_5))
+ {
+ // 数字キーの5を入力
+ entryValue(5);
+ }
+ else if ((keyCode == KeyEvent.KEYCODE_6))
+ {
+ // 数字キーの6を入力
+ entryValue(6);
+ }
+ else if ((keyCode == KeyEvent.KEYCODE_7))
+ {
+ // 数字キーの7を入力
+ entryValue(7);
+ }
+ else if ((keyCode == KeyEvent.KEYCODE_8))
+ {
+ // 数字キーの8を入力
+ entryValue(8);
+ }
+ else if ((keyCode == KeyEvent.KEYCODE_9))
+ {
+ // 数字キーの9を入力
+ entryValue(9);
+ }
+ else
+ {
+ // 上記以外が入力されたとき
+ ret = false;
+ }
+*/
+ return (false);
+ }
+}
--- /dev/null
+package jp.sourceforge.gokigen.warikan;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.widget.TextView;
+import android.widget.CheckBox;
+
+/**
+ * TheWarikanのメイン画面
+ * @author MRSa
+ *
+ */
+public class TheWarikan extends Activity
+{
+ MainScreenUpdater updater = null; // 画面表示更新クラス
+ MainScreenListener listener = null; // イベントリスナクラス
+
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+
+ // 画面情報表示クラスの生成
+ updater = new MainScreenUpdater(this);
+
+ // 画面オブジェクトに対し、イベントを処理するクラスを設定する
+ // (Qtでいうところの、Signal-Slot 接続みたいなものかな...)
+ listener = new MainScreenListener(this, updater);
+
+ final TextView totalPayment = findViewById(R.id.totalPaymentData);
+ totalPayment.setOnClickListener(listener);
+
+ final TextView gentlemen = findViewById(R.id.numberOfGentlemen);
+ gentlemen.setOnClickListener(listener);
+
+ final TextView men = findViewById(R.id.numberOfMen);
+ men.setOnClickListener(listener);
+
+ final TextView women = findViewById(R.id.numberOfWomen);
+ women.setOnClickListener(listener);
+
+ final TextView gentlemenPayment = findViewById(R.id.GentlemenMoney);
+ gentlemenPayment.setOnClickListener(listener);
+
+ final TextView menPayment = findViewById(R.id.MenMoney);
+ menPayment.setOnClickListener(listener);
+
+ final TextView womenPayment = findViewById(R.id.WomenMoney);
+ womenPayment.setOnClickListener(listener);
+
+ final CheckBox chargeCheck = findViewById(R.id.chkAddCharge);
+ chargeCheck.setOnCheckedChangeListener(listener);
+ }
+
+ /**
+ * 画面が裏に回ったときの処理
+ */
+ @Override
+ public void onPause()
+ {
+ super.onPause();
+ }
+
+ /**
+ * 画面が表に出てきたときの処理
+ */
+ @Override
+ public void onResume()
+ {
+ super.onResume();
+ try
+ {
+ // 画面表示内容の更新を行うよう、画面情報表示クラスに依頼する
+ updater.updateScreen();
+ }
+ catch (Exception ex)
+ {
+ // なにもしない
+ }
+ }
+
+ /**
+ * 子画面から応答をもらったときの処理
+ * (実処理は 画面情報表示クラスの生成で行う。)
+ */
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data)
+ {
+ try
+ {
+ // 画面表示処理を画面情報表示クラスに依頼する
+ updater.onActivityResult(requestCode, resultCode, data);
+ }
+ catch (Exception ex)
+ {
+ // 例外が発生したときには、何もしない。
+ }
+ }
+}
--- /dev/null
+<?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:background="#a0a0a0"
+ >
+
+ <!-- 支払い総額の設定領域 -->
+ <TextView
+ android:id="@+id/totalPaymentLabel"
+ android:text="@string/totalPayment"
+ android:textSize="11pt"
+ android:textStyle="bold"
+ android:textColor="#0a0a0a"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ </TextView>
+ <TextView
+ android:id="@+id/totalPaymentData"
+ android:text="@string/default_yen_value"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@android:drawable/editbox_background"
+ android:layout_toRightOf="@id/totalPaymentLabel"
+ android:layout_toEndOf="@id/totalPaymentLabel"
+ android:layout_alignTop="@id/totalPaymentLabel"
+ android:layout_marginLeft="6dp"
+ android:layout_marginStart="6dp"
+ android:textSize="11pt"
+ android:textStyle="bold"
+ android:textColor="#0a0a0a">
+ </TextView>
+ <TextView
+ android:id="@+id/paymentUnit"
+ android:text="@string/Yen"
+ android:textSize="11pt"
+ android:textColor="#0a0a0a"
+ android:layout_toRightOf="@id/totalPaymentData"
+ android:layout_toEndOf="@id/totalPaymentData"
+ android:layout_alignTop="@id/totalPaymentData"
+ android:layout_centerInParent="true"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ </TextView>
+
+<!--
+ < Button
+ android:id="@+id/button_setPayment"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/paymentUnit"
+ android:layout_alignTop="@id/paymentUnit"
+ android:layout_marginLeft="12px"
+ android:textSize="8pt"
+ android:text="@string/button_set" >
+ < / Button >
+-->
+
+ <!-- サービス料加算 -->
+ <CheckBox android:id="@+id/chkAddCharge"
+ android:text="@string/check_Charge"
+ android:textSize="9pt"
+ android:textColor="#0a0a0a"
+ android:layout_below="@id/totalPaymentData"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
+ android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ </CheckBox>
+ <TextView
+ android:id="@+id/serviceCharge"
+ android:text="@string/spacer"
+ android:layout_toRightOf="@id/chkAddCharge"
+ android:layout_toEndOf="@id/chkAddCharge"
+ android:layout_alignBaseline="@id/chkAddCharge"
+ android:textSize="9pt"
+ android:textColor="#0a0a0a"
+ android:layout_marginTop="10dp"
+ android:layout_marginLeft="12dp"
+ android:layout_marginStart="12dp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ </TextView>
+
+ <!-- ここから割り勘人員構成表示 -->
+
+ <!-- スポンサーさん -->
+ <ImageView
+ android:id="@+id/gentlemenImage"
+ android:scaleType="centerInside"
+ android:layout_width="34dp"
+ android:layout_height="34dp"
+ android:layout_below="@id/chkAddCharge"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
+ android:layout_marginTop="4dp"
+ android:layout_marginRight="4dp"
+ android:layout_marginEnd="4dp"
+ android:src="@drawable/gentlemens"
+ />
+ <ImageView
+ android:id="@+id/gentlemenTimes"
+ android:scaleType="centerInside"
+ android:layout_centerInParent="true"
+ android:layout_toRightOf="@id/gentlemenImage"
+ android:layout_toEndOf="@id/gentlemenImage"
+ android:layout_alignTop="@id/gentlemenImage"
+ android:layout_width="12dp"
+ android:layout_height="34dp"
+ android:src="@drawable/times"
+ />
+ <TextView
+ android:id="@+id/numberOfGentlemen"
+ android:text="@string/default_yen_value"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@android:drawable/editbox_background"
+ android:layout_toRightOf="@id/gentlemenTimes"
+ android:layout_toEndOf="@id/gentlemenTimes"
+ android:layout_alignTop="@id/gentlemenImage"
+ android:textStyle="bold"
+ android:textSize="9pt"
+ android:textColor="#0a0a0a"
+ />
+ <TextView
+ android:id="@+id/numberOfGentlemenLabel"
+ android:text="@string/person"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/numberOfGentlemen"
+ android:layout_toEndOf="@id/numberOfGentlemen"
+ android:layout_alignBottom="@id/numberOfGentlemen"
+ android:textSize="12pt"
+ android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
+ android:textColor="#0a0a0a"
+ />
+ <TextView
+ android:id="@+id/GentlemenMoney"
+ android:text="@string/default_yen_value"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/numberOfGentlemenLabel"
+ android:layout_toEndOf="@id/numberOfGentlemenLabel"
+ android:layout_alignBottom="@id/numberOfGentlemen"
+ android:layout_marginRight="2dp"
+ android:layout_marginEnd="2dp"
+ android:textSize="10pt"
+ android:textColor="#0a0a0a"
+ android:background="@android:drawable/editbox_background"
+ />
+ <TextView
+ android:id="@+id/GentlemenMoneyUnit"
+ android:text="@string/payPerPerson"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/GentlemenMoney"
+ android:layout_toEndOf="@id/GentlemenMoney"
+ android:layout_alignBottom="@id/numberOfGentlemen"
+ android:layout_marginRight="2dp"
+ android:layout_marginEnd="2dp"
+ android:textSize="10pt"
+ android:textColor="#0a0a0a"
+ />
+
+ <!-- 男性 -->
+ <ImageView
+ android:id="@+id/menImage"
+ android:scaleType="centerInside"
+ android:layout_width="34dp"
+ android:layout_height="34dp"
+ android:layout_below="@id/GentlemenMoney"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
+ android:layout_marginRight="4dp"
+ android:layout_marginEnd="4dp"
+ android:src="@drawable/mens"
+ />
+ <ImageView
+ android:id="@+id/menTimes"
+ android:scaleType="centerInside"
+ android:layout_centerInParent="true"
+ android:layout_toRightOf="@id/menImage"
+ android:layout_toEndOf="@id/menImage"
+ android:layout_alignTop="@id/menImage"
+ android:layout_width="12dp"
+ android:layout_height="34dp"
+ android:src="@drawable/times"
+ />
+ <TextView
+ android:id="@+id/numberOfMen"
+ android:text="@string/default_yen_value"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@android:drawable/editbox_background"
+ android:layout_toRightOf="@id/menTimes"
+ android:layout_toEndOf="@id/menTimes"
+ android:layout_alignTop="@id/menImage"
+ android:textStyle="bold"
+ android:textSize="9pt"
+ android:textColor="#0a0a0a"
+ />
+ <TextView
+ android:id="@+id/numberOfMenLabel"
+ android:text="@string/person"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/numberOfMen"
+ android:layout_toEndOf="@id/numberOfMen"
+ android:layout_alignBottom="@id/numberOfMen"
+ android:textSize="12pt"
+ android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
+ android:textColor="#0a0a0a"
+ />
+ <TextView
+ android:id="@+id/MenMoney"
+ android:text="@string/default_yen_value"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/numberOfMenLabel"
+ android:layout_toEndOf="@id/numberOfMenLabel"
+ android:layout_alignBottom="@id/numberOfMen"
+ android:layout_marginRight="2dp"
+ android:layout_marginEnd="2dp"
+ android:textSize="10pt"
+ android:textColor="#0a0a0a"
+ android:background="@android:drawable/editbox_background"
+ />
+ <TextView
+ android:id="@+id/MenMoneyUnit"
+ android:text="@string/payPerPerson"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/MenMoney"
+ android:layout_toEndOf="@id/MenMoney"
+ android:layout_alignBottom="@id/numberOfMen"
+ android:layout_marginRight="2dp"
+ android:layout_marginEnd="2dp"
+ android:textSize="10pt"
+ android:textColor="#0a0a0a"
+ />
+
+ <!-- 女性 -->
+ <ImageView
+ android:id="@+id/womenImage"
+ android:scaleType="centerInside"
+ android:layout_width="34dp"
+ android:layout_height="34dp"
+ android:layout_below="@id/MenMoney"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
+ android:layout_marginRight="4dp"
+ android:layout_marginEnd="4dp"
+ android:src="@drawable/womens"
+ />
+ <ImageView
+ android:id="@+id/womenTimes"
+ android:scaleType="centerInside"
+ android:layout_centerInParent="true"
+ android:layout_toRightOf="@id/womenImage"
+ android:layout_toEndOf="@id/womenImage"
+ android:layout_alignTop="@id/womenImage"
+ android:layout_width="12dp"
+ android:layout_height="34dp"
+ android:layout_marginBottom="4dp"
+ android:src="@drawable/times"
+ />
+ <TextView
+ android:id="@+id/numberOfWomen"
+ android:text="@string/default_yen_value"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@android:drawable/editbox_background"
+ android:layout_toRightOf="@id/womenTimes"
+ android:layout_toEndOf="@id/womenTimes"
+ android:layout_alignTop="@id/womenImage"
+ android:textStyle="bold"
+ android:textSize="9pt"
+ android:textColor="#0a0a0a"
+ />
+ <TextView
+ android:id="@+id/numberOfWomenLabel"
+ android:text="@string/person"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/numberOfWomen"
+ android:layout_toEndOf="@id/numberOfWomen"
+ android:layout_alignBottom="@id/numberOfWomen"
+ android:textSize="12pt"
+ android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
+ android:textColor="#0a0a0a"
+ />
+ <TextView
+ android:id="@+id/WomenMoney"
+ android:text="@string/default_yen_value"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/numberOfWomenLabel"
+ android:layout_toEndOf="@id/numberOfWomenLabel"
+ android:layout_alignBottom="@id/numberOfWomen"
+ android:layout_marginRight="2dp"
+ android:layout_marginEnd="2dp"
+ android:textSize="10pt"
+ android:textColor="#0a0a0a"
+ android:background="@android:drawable/editbox_background"
+ />
+ <TextView
+ android:id="@+id/WomenMoneyUnit"
+ android:text="@string/payPerPerson"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/WomenMoney"
+ android:layout_toEndOf="@id/WomenMoney"
+ android:layout_alignBottom="@id/numberOfWomen"
+ android:layout_marginRight="2dp"
+ android:layout_marginEnd="2dp"
+ android:textSize="10pt"
+ android:textColor="#0a0a0a"
+ />
+
+ <!-- 支払い総額の表示欄設定 -->
+ <TextView
+ android:id="@+id/totalAmountLabel"
+ android:text="@string/totalAmount"
+ android:layout_below="@id/womenTimes"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
+ android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
+ android:textSize="9pt"
+ android:textStyle="bold"
+ android:textColor="#0a0a0a"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="6dp"
+ android:layout_marginEnd="6dp"
+ />
+ <TextView
+ android:id="@+id/totalAmountValue"
+ android:text="@string/default_yen_value"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/totalAmountLabel"
+ android:layout_toEndOf="@id/totalAmountLabel"
+ android:layout_alignBottom="@id/totalAmountLabel"
+ android:textStyle="bold"
+ android:textSize="9pt"
+ android:textColor="#0a0a0a"
+ />
+ <TextView
+ android:id="@+id/totalAmountUnit"
+ android:text="@string/Yen"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/totalAmountValue"
+ android:layout_toEndOf="@id/totalAmountValue"
+ android:layout_alignBottom="@id/totalAmountLabel"
+ android:layout_marginRight="6dp"
+ android:layout_marginEnd="6dp"
+ android:textSize="9pt"
+ android:textColor="#0a0a0a"
+ />
+ <TextView
+ android:id="@+id/additionalInfoTotalAmount"
+ android:text="@string/description"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/totalAmountUnit"
+ android:layout_toEndOf="@id/totalAmountUnit"
+ android:layout_alignBottom="@id/totalAmountLabel"
+ android:textSize="9pt"
+ android:textColor="#0a0a0a"
+ />
+</RelativeLayout>
--- /dev/null
+<?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"
+ >
+ <TextView
+ android:id="@+id/tenKeyMessage"
+ android:text="@string/spacer"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+ </TextView>
+ <EditText
+ android:id="@+id/numericData"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:background="@android:drawable/editbox_background"
+ android:hint="@string/description"
+ android:layout_below="@id/tenKeyMessage">
+ </EditText>
+ <Button
+ android:id="@+id/button_Clear"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/numericData"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
+ android:layout_marginLeft="4dp"
+ android:layout_marginStart="4dp"
+ android:textSize="8pt"
+ android:text="@string/label_clear">
+ </Button>
+ <Button
+ android:id="@+id/button_Seven"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/numericData"
+ android:layout_marginRight="4dp"
+ android:layout_marginEnd="4dp"
+ android:textSize="8pt"
+ android:text="@string/label_seven">
+ </Button>
+ <Button
+ android:id="@+id/button_Eight"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/button_Seven"
+ android:layout_toEndOf="@id/button_Seven"
+ android:layout_alignTop="@id/button_Seven"
+ android:layout_marginRight="4dp"
+ android:layout_marginEnd="4dp"
+ android:textSize="8pt"
+ android:text="@string/label_eight">
+ </Button>
+ <Button
+ android:id="@+id/button_Nine"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/button_Eight"
+ android:layout_toEndOf="@id/button_Eight"
+ android:layout_alignTop="@id/button_Eight"
+ android:layout_marginRight="4dp"
+ android:layout_marginEnd="4dp"
+ android:textSize="8pt"
+ android:text="@string/label_nine">
+ </Button>
+ <Button
+ android:id="@+id/button_Four"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/button_Seven"
+ android:layout_marginRight="4dp"
+ android:layout_marginEnd="4dp"
+ android:textSize="8pt"
+ android:text="@string/label_four">
+ </Button>
+ <Button
+ android:id="@+id/button_Five"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/button_Eight"
+ android:layout_toRightOf="@id/button_Four"
+ android:layout_toEndOf="@id/button_Four"
+ android:layout_marginRight="4dp"
+ android:layout_marginEnd="4dp"
+ android:textSize="8pt"
+ android:text="@string/label_five">
+ </Button>
+ <Button
+ android:id="@+id/button_Six"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/button_Nine"
+ android:layout_toRightOf="@id/button_Five"
+ android:layout_toEndOf="@id/button_Five"
+ android:layout_marginRight="4dp"
+ android:layout_marginEnd="4dp"
+ android:textSize="8pt"
+ android:text="@string/label_six">
+ </Button>
+ <Button
+ android:id="@+id/button_One"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/button_Four"
+ android:layout_marginRight="4dp"
+ android:layout_marginEnd="4dp"
+ android:textSize="8pt"
+ android:text="@string/label_one">
+ </Button>
+ <Button
+ android:id="@+id/button_Two"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/button_Five"
+ android:layout_toRightOf="@id/button_One"
+ android:layout_toEndOf="@id/button_One"
+ android:layout_marginRight="4dp"
+ android:layout_marginEnd="4dp"
+ android:textSize="8pt"
+ android:text="@string/label_two">
+ </Button>
+ <Button
+ android:id="@+id/button_Three"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/button_Six"
+ android:layout_toRightOf="@id/button_Two"
+ android:layout_toEndOf="@id/button_Two"
+ android:layout_marginRight="4dp"
+ android:layout_marginEnd="4dp"
+ android:textSize="8pt"
+ android:text="@string/label_three">
+ </Button>
+ <Button
+ android:id="@+id/button_Zero"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/button_One"
+ android:layout_marginRight="4dp"
+ android:layout_marginEnd="4dp"
+ android:textSize="8pt"
+ android:text="@string/label_zero">
+ </Button>
+ <Button
+ android:id="@+id/button_ZeroZero"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/button_Two"
+ android:layout_toRightOf="@id/button_Zero"
+ android:layout_toEndOf="@id/button_Zero"
+ android:textSize="8pt"
+ android:text="@string/label_zerozero">
+ </Button>
+ <Button
+ android:id="@+id/button_Cancel"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/button_Three"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
+ android:textSize="8pt"
+ android:text="@string/button_cancel">
+ </Button>
+ <Button
+ android:id="@+id/button_Enter"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toLeftOf="@id/button_Cancel"
+ android:layout_toStartOf="@id/button_Cancel"
+ android:layout_alignTop="@id/button_Cancel"
+ android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
+ android:textStyle="bold"
+ android:textSize="8pt"
+ android:text="@string/button_enter">
+ </Button>
+</RelativeLayout>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">わりかん</string>
+ <string name="title">わりかん</string>
+ <string name="Yen">円</string>
+ <string name="totalAmount">合計</string>
+ <string name="spacer"> </string>
+ <string name="totalPayment">請求金額</string>
+ <string name="modStart">(おつり </string>
+ <string name="modEnd"> 円)</string>
+ <string name="check_Charge">サービス料</string>
+ <string name="name_tenKey">数値入力</string>
+ <string name="payment_Message">支払金額を入力してください。</string>
+ <string name="serviceCharge_Message">サービス料の割合を % で入力してください。</string>
+ <string name="numberOfGentlemen_Message">スポンサーの人数を入力してください。</string>
+ <string name="numberOfMen_Message">男性の人数を入力してください。</string>
+ <string name="numberOfWomen_Message">女性の人数を入力してください。</string>
+ <string name="paymentGentlemen_Message">スポンサーが払う額を入力してください。</string>
+ <string name="paymentMen_Message">男性が払う額を入力してください。</string>
+ <string name="paymentWomen_Message">女性が払う額を入力してください。</string>
+ <string name="info_postfix">です。</string>
+ <string name="info_payment">支払い金額は、</string>
+ <string name="info_updatePayment">それぞれの支払い金額を計算しました。</string>
+ <string name="person">人</string>
+ <string name="payPerPerson">円/人</string>
+ <string name="default_yen_value">0</string>
+ <string name="description"> </string>
+ <string name="label_clear">CLR</string>
+ <string name="button_cancel">Cancel</string>
+ <string name="button_enter">Enter</string>
+ <string name="label_zerozero">00</string>
+ <string name="label_zero">0</string>
+ <string name="label_one">1</string>
+ <string name="label_two">2</string>
+ <string name="label_three">3</string>
+ <string name="label_four">4</string>
+ <string name="label_five">5</string>
+ <string name="label_six">6</string>
+ <string name="label_seven">7</string>
+ <string name="label_eight">8</string>
+ <string name="label_nine">9</string>
+</resources>
--- /dev/null
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+buildscript {
+ repositories {
+ jcenter()
+ google()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.1.3'
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ maven {
+ url "https://maven.google.com"
+ }
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
--- /dev/null
+include ':app'