Kotlin ã§ç°¡åãªãããèšç®ã¢ããªã±ãŒã·ã§ã³ãäœæããæ¹æ³ã瀺ããŸãã ããæ£ç¢ºã«ã¯ãKotlin 1.3.21ãAndroid 4ãAndroid Studio 3ããã®èšäºã¯ããŸã Android ã¢ããªã±ãŒã·ã§ã³ã®éçºãå§ãã人ã«ãšã£ãŠèå³æ·±ããã®ãšãªãã§ãããã ããã«ãããã¢ããªã±ãŒã·ã§ã³å
ã§äœãã©ã®ããã«æ©èœããããç解ã§ããŸãã
ãã®ãããªèšç®æ©ã¯ãã¬ã¹ãã©ã³ãã«ãã§ã§æéãéããããšã決ããäŒç€Ÿããã®ãããã®éé¡ãèšç®ããå¿
èŠãããå Žåã«åœ¹ç«ã¡ãŸãã ãã¡ããã誰ãããŠã§ã€ã¿ãŒã«ãè¶ãæ®ãããã§ã¯ãªããåžžã«ãŠã§ã€ã¿ãŒã«ãè¶ãæ®ãããã§ã¯ãããŸãããããã¯ããã西æŽã®äŒçµ±ã§ããããããã«ããããã®ãããªã¢ããªã±ãŒã·ã§ã³ãéçºããããã»ã¹ã¯èå³æ·±ããã®ã§ãã
ãªãã€ã³ããŒïŒ ãHabrãã®ãã¹ãŠã®èªè ã察象 - ãHabrãããã¢ãŒã·ã§ã³ ã³ãŒãã䜿çšããŠã¹ãã«ããã¯ã¹ ã³ãŒã¹ã«ç»é²ãããš 10 ã«ãŒãã«ã®å²åŒã
ã¹ãã«ããã¯ã¹ã¯æ¬¡ã®ããšãæšå¥šããŸãã å®è·µã³ãŒã¹
ãã¢ãã€ã« ããããã㌠PROã .
ã¢ããªã®å®è¡æã®å€èŠ³ã¯æ¬¡ã®ãšããã§ãã
åèšéé¡ã«å¯Ÿããåžæã®å²åãããŒãã£ã³ã°ã®åå è
æ°ãå
¥åãããšãæ®ãã¹ããããã®éãšããçµæãåŸãããŸãã
ã¯ããã«
ã¢ããªã®å®å
šãªã€ã³ã¿ãŒãã§ã€ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
æåã®ã¢ã¯ã·ã§ã³ -
ãŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ã¯æç³»åã§ãããžã§ã¯ãã«æžã蟌ãŸããããããã¹ãŠãæ確ã«ãªããŸãã ããã衚瀺ããã«ã¯ã[衚瀺] -> [ããŒã« ãŠã£ã³ããŠ] -> [TODO] ãéããŸãã
ãããžã§ã¯ãã調æ»ããcolors.xml ãéããŠã«ã©ãŒ ãã¬ãããè©äŸ¡ããŸãã strings.xml ã«ã¯ããã¹ã ããŒã¿ (ãã£ãã·ã§ã³) ãå«ãŸããstyles.xml ã«ã¯ããã€ãã®ãã©ã³ã ãã³ãã¬ãŒããå«ãŸããŸãã
å䟡ã»ã¯ã·ã§ã³ã®éçº
activity_main.xml ãéãã以äžã®ã³ãŒãã LinearLayout (#1) ã«è¿œå ããŸãã
<TextView
android_id="@+id/expensePerPersonTextView"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_paddingTop="30dp"
style="@style/h1Bold"
android_textColor="@color/colorAccent"
android_text="0"/>
<TextView
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_paddingBottom="25dp"
style="@style/h2"
android_textColor="@color/colorAccent"
android_text="@string/perPersonStaticText"/>
ããã§ãå€ãã£ã¬ã¯ããªã®ã¹ã¿ã€ã«ãèšå®ãããã次ã䜿çšããŠè²ã調æŽãããã§ããŸãã
ããã§ããããžã§ã¯ãã¯æ¬¡ã®ããã«ãªããŸãã
ã芧ã®ãšãããã³ã¹ãã®èšç®ã¯ãŠãŒã¶ãŒãå
¥åããããŒã¿ã«åºã¥ããŠããŸãã
ã¢ã«ãŠã³ãã»ã¯ã·ã§ã³ã®éçº
以äžã®ã³ãŒãã LinearLayout ã® Expense ã»ã¯ã·ã§ã³ (#2) ã®åŸã«è¿œå ããŸãã
<LinearLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
android_orientation="vertical"
android_background="@color/colorAccent">
<! â TODO #3: Build Bill Section â
âŠ
</LinearLayout>
TODO ãªã¹ãã®åŸã§ LinearLayout ãéããæ°ããã³ãŒããè¿œå ã㊠LinearLayout å ã«é 眮ããŸã (#3)ã
<TextView
android_layout_margin="15dp"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_textColor="@color/colorWhite"
style="@style/h4"
android_text="@string/billStaticText"/>
<EditText
android_id="@+id/billEditText"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_textColor="@color/colorWhite"
android_inputType="numberDecimal"
android_maxLines="1"
style="@style/h2Bold"
android_text="0"/>
ã¢ããªã±ãŒã·ã§ã³ã®äž»ãªã¿ã¹ã¯ã¯ãã¬ã¹ãã©ã³ã§ã®éãŸãã®ååå è ã®åå¥ã³ã¹ããèšç®ããããšã§ãããããcostPerPersonTextView ãäž»ãªåœ¹å²ãæãããŸãã
EditText ã¯å ¥åã XNUMX è¡ã«å¶éããããããã®ãã©ã¡ãŒã¿ã¯ NumberDecimal inputType ã«èšå®ããå¿ èŠããããŸãã
ãã¹ãçšã®ãããžã§ã¯ããéå§ããåèšãã¡ãŒãž (å£ããã«ãããç¿ãªã©) ã®ãã©ã¡ãŒã¿ãå
¥åããŸãã
ã人ãšãã³ããã»ã¯ã·ã§ã³ã®éçº
ãããéé¡ã»ã¬ã¯ã¿ãŒãè¿œå ããã«ã¯ã以äžã®ã³ãŒããæ°ãã LinearLayout ã»ã¯ã·ã§ã³ (#4) ã«è²Œãä»ããŸãã
<TextView
android_layout_margin="15dp"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_textColor="@color/colorWhite"
style="@style/h4"
android_text="@string/tipStaticText"/>
<LinearLayout
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_orientation="horizontal">
<ImageButton
android_id="@+id/subtractTipButton"
style="@style/operationButton"
android_layout_marginLeft="20dp"
android_layout_marginStart="20dp"
android_src="@drawable/subtract"/>
<TextView
android_id="@+id/tipTextView"
android_layout_margin="15dp"
android_layout_width="0dp"
android_layout_height="wrap_content"
android_textColor="@color/colorWhite"
android_layout_weight="1"
style="@style/h2Bold"
android_text="20%"/>
<ImageButton
android_id="@+id/addTipButton"
style="@style/operationButton"
android_layout_marginEnd="20dp"
android_layout_marginRight="20dp"
android_src="@drawable/add"/>
</LinearLayout>
ãã®ã³ãŒãã¯ããããã®éé¡ãæ£ç¢ºã«èšç®ããããã«å¿ èŠã§ãã ããã©ã«ãã®ããã¹ãå€ã¯ 20 ã§ããImageButton ã¯ãæžã蟌ã¿æš©éã®ãããã©ã«ããŒå ã®ã¢ã€ã³ã³ãšãšãã«æäŸãããŸãã
ã»ã¯ã·ã§ã³å šäœãã³ããŒãã次ã®è¡ãè¿œå ããŸã (#5)ã
- ImageButton ID (subtractPeopleButtonãaddPeopleButton)
- TextView ID (numberOfPeopleStaticTextãnumberOfPeopleTextView)
- numberOfPeopleTextView ã® DefaultText (4 ã§ããå¿ èŠããããŸã)ã
ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšãè«æ±éé¡ãè¿œå ããããšãã§ããè¿œå /æžç®ãã¿ã³ãæ©èœããŸãããä»ã®ãšããäœãèµ·ãããŸããã
ãã¥ãŒã®è¿œå
MainActivity.kt ãéããããã initViews é¢æ°ã«è¿œå ããŸã (#6)ã
private fun initViews() {
expensePerPersonTextView = findViewById(R.id.expensePerPersonTextView)
billEditText = findViewById(R.id.billEditText)
addTipButton = findViewById(R.id.addTipButton)
tipTextView = findViewById(R.id.tipTextView)
subtractTipButton = findViewById(R.id.subtractTipButton)
addPeopleButton = findViewById(R.id.addPeopleButton)
numberOfPeopleTextView = findViewById(R.id.numberOfPeopleTextView)
subtractPeopleButton = findViewById(R.id.subtractPeopleButton)
//TODO #8: Bind Buttons to Listener
//TODO #16: Bind EditText to TextWatcher
}
ãã¿ã³ã®ä»äžã
ãã¿ã³ã®ã¯ãªãã¯ã®ãµããŒããè¿œå ããã«ã¯ãã¯ã©ã¹ ã¬ãã«ã§ View.OnClickListener ãå®è£ ããŸã (#7)ã
class MainActivity: AppCompatActivity(), View.OnClickListener {
ãããžã§ã¯ããä»ããã³ã³ãã€ã«ããŠãæ©èœããŸãããããã«ããã€ãã®æé (# 8) ãå®è¡ããå¿ èŠããããŸãã
override fun onClick(v: View?) {
when (v?.id) {
R.id.addTipButton -> incrementTip()
R.id.subtractTipButton -> decrementTip()
R.id.addPeopleButton -> incrementPeople()
R.id.subtractPeopleButton -> decrementPeople()
}
}
ãã¿ã³ãšã¹ã€ããã«é¢ããŠã¯ãKotlin ã§ã¯ãã¹ãŠãéåžžã«ã¯ãŒã«ã«æŽçãããŠããŸãã 以äžã®ã³ãŒãããã¹ãŠã®ã€ã³ã¯ãªã¡ã³ãé¢æ°ãšãã¯ãªã¡ã³ãé¢æ°ã«è¿œå ããŸãã
(#9 â#12):
private fun incrementTip() {
if (tipPercent != MAX_TIP) {
tipPercent += TIP_INCREMENT_PERCENT
tipTextView.text = String.format("%d%%", tipPercent)
}
}
private fun decrementTip() {
if (tipPercent != MIN_TIP) {
tipPercent -= TIP_INCREMENT_PERCENT
tipTextView.text = String.format("%d%%", tipPercent)
}
}
private fun incrementPeople() {
if (numberOfPeople != MAX_PEOPLE) {
numberOfPeople += PEOPLE_INCREMENT_VALUE
numberOfPeopleTextView.text = numberOfPeople.toString()
}
}
private fun decrementPeople() {
if (numberOfPeople != MIN_PEOPLE) {
numberOfPeople -= PEOPLE_INCREMENT_VALUE
numberOfPeopleTextView.text = numberOfPeople.toString()
}
}
ããã§ãã³ãŒãã¯æå€§å€ (MAX_TIP ããã³ MAX_PEOPLE) ã䜿çšããŠã€ã³ã¯ãªã¡ã³ãé¢æ°ãä¿è·ããŸãã ããã«ãã³ãŒãã¯æå°å€ (MIN_TIP ããã³ MIN_PEOPLE) ã䜿çšããŠãã¯ãªã¡ã³ãé¢æ°ãä¿è·ããŸãã
次ã«ãinitViews é¢æ°ã§ãã¿ã³ããªã¹ããŒã«ãã€ã³ãããŸã (#13)ã
private fun initViews() {
...
addTipButton.setOnClickListener(this)
subtractTipButton.setOnClickListener(this)
addPeopleButton.setOnClickListener(this)
subtractPeopleButton.setOnClickListener(this)
//TODO #15: Bind EditText to TextWatcher
}
åèšãã¡ãŒãžãããããäŒè°åå è
æ°ãè¿œå ã§ããããã«ãªããŸããã ããŠãããã§æãéèŠãªããšã¯âŠ
ã³ã¹ãã»ã¯ã·ã§ã³
ãã®ã³ãŒãã¯ã³ã¹ããèšç®ããŸã (#14)ã
private fun calculateExpense() {
val totalBill = billEditText.text.toString().toDouble()
val totalExpense = ((HUNDRED_PERCENT + tipPercent) / HUNDRED_PERCENT) * totalBill
val individualExpense = totalExpense / numberOfPeople
expensePerPersonTextView.text = String.format("$%.2f", individualExpense)
}
ããŠãããã§ã¯ã瀟å ã®äººæ°ãèæ ®ããŠããããèšç®ã§ããããã«ããé¢æ°ãåŒã³åºãããŠããŸã (#15)ã
private fun incrementTip() {
âŠ
}
private fun decrementTip() {
âŠ
}
private fun incrementPeople() {
âŠ
}
private fun decrementPeople() {
âŠ
}
ã¢ããªã±ãŒã·ã§ã³ãèµ·åããŸãã èŠãç®ãæ©èœãçŽ æŽãããã§ãã ããããããã¯ãã£ãšè¯ããããããŸããã
è«æ±éé¡ãåé€ããŠãããã³ããåéã®æ°ãå¢ããããšãããšãã³ã¹ãããŒãã§ãããã©ããã®ãã§ãã¯ããŸã è¡ãããŠããªããããã¢ããªãã¯ã©ãã·ã¥ããŸãã ãŸããè«æ±é¡ãå€æŽããããšããŠãæéã¯æŽæ°ãããŸããã
æçµã¹ããã
TextWatcher ãè¿œå ããŸã (#16):
class MainActivity: AppCompatActivity()ãView.OnClickListenerãTextWatcher {
次ã«ã billEditText ãªã¹ã㌠(#17) ãåã蟌ã¿ãŸãã
billEditText.addTextChangedListener(this)
ããã«ãTextWatcher ãå®è¡ããã³ãŒããè¿œå ããŸã (#18)ã
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
if (!billEditText.text.isEmpty()) {
calculateExpense()
}
}
override fun afterTextChanged(s: Editable?) {}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
ããŠãããã§ãã¹ãŠãããŸããããŸããïŒ ããã§ãšãããããŸããKotlin ã§ç¬èªã®ããããèšç®ããŒã«ããäœæããŸããã
ã¹ãã«ããã¯ã¹ã¯æ¬¡ã®ããšãæšå¥šããŸãã
- XNUMX幎éã®å®è·µã³ãŒã¹
ãç§ã¯ããã®ãŠã§ãéçºè ã§ãã .- ãªã³ã©ã€ã³ã³ãŒã¹
ãC#éçºè ã .- å®è·µäžå¹Žã³ãŒã¹
ã0ããPROãŸã§ã®PHPéçºè ã .
åºæïŒ habr.com