Kotlin言語のAndroidアプリで、テキストボックス及びボタンのプロパティ(IsEnabled)がうまく動作致しません。
Q&A
Closed
解決したいこと
ハンディースキャナーで読み取ったデータの種類毎に、入力制限を設けたいので、テキストボックスのIsEnabledを変更したい。
発生している問題・エラー
以下の画像の[L,W,取数]のテキストボックスのenabledをハンディースキャナーで読み取ったデータの種類毎に変更したい。
単位が「m3」または「石」のものは、[L,W]のテキストボックスのIsEnabledを『true』、[取数]のテキストボックスのIsEnabledを『false』
単位が上記以外のものは、[L,W]のテキストボックスのIsEnabledを『false』、[取数]のテキストボックスのIsEnabledを『true』
アプリを立ち上げて、最初に読み込んだ場合は、商品の種類によって、IsEnabledの状態がきちんと意図通りになるのですが、
2回目以降は、IsEnabledの状態が変化せず、ずっと一番最初に読み込んだ商品の種類によって決定されたIsEnabledの状態が続く。
以下ソースコードのprivate val receiver by lazy関数内の
editTextNumber1.text.clear()
(editTextNumber4 as TextView).text = "1"
(editTextNumber1 as TextView).text = dataList[4]
(editTextNumber2 as TextView).text = width
は動作しますが、
editTextNumber1.isEnabled = true
button.isEnabled = false
button.isEnabled = true
がうまく動作しません。
該当するソースコード
package com.example.inventory2023
class MainActivity : AppCompatActivity() {
private var barcodeDataCopy: String? = ""
private val itemArray = arrayOf(
"登録番号", "品目", "商品番号", "品名", "L",
"樹種", "原産地", "仕入先", "入荷日", "入荷数", "入荷材積数", "単位"
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ボタン不能化
val button: Button = findViewById(R.id.button)
button.isEnabled = false
// Scan開始部
thread(start = true) {
try {
startScanService()
Thread.sleep(500) // USS の開始を 500 ミリ秒以上待機します
closetScanToKey()
} catch (e: InterruptedException) {
e.printStackTrace()
}
}
}
// Unitech部
private val filter by lazy {
IntentFilter().apply {
addAction("unitech.scanservice.data")
}
}
private val receiver by lazy {
object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
intent ?: return
if (intent.action.equals("unitech.scanservice.data")) {
val barcodeData = intent.getStringExtra("text")
barcodeDataCopy = barcodeData
// 表示初期化
val editTextNumber1: EditText = findViewById(R.id.editTextNumberDecimal1)
editTextNumber1.text.clear()
editTextNumber1.isEnabled = true
val editTextNumber2: EditText = findViewById(R.id.editTextNumberDecimal2)
editTextNumber2.text.clear()
editTextNumber2.isEnabled = true
val editTextNumber3: EditText = findViewById(R.id.editTextNumber1)
editTextNumber3.text.clear()
val editTextNumber4: EditText = findViewById(R.id.editTextNumber2)
(editTextNumber4 as TextView).text = "1"
editTextNumber4.isEnabled = true
val button: Button = findViewById(R.id.button)
button.isEnabled = false
// リスト作成部
val list: MutableList<Map<String, String>> = ArrayList()
list.clear()
val dataList = barcodeData!!.split(",").toMutableList()
if (dataList.size != 17) {
AlertDialog.Builder(this@MainActivity)
.setTitle("読み取りエラー!!")
.setMessage("再度Scanしてください。")
.setPositiveButton("OK") { _, _ -> }
.show()
return
}
val width = dataList[6]
dataList.removeAt(16)
dataList.removeAt(15)
dataList.removeAt(7)
dataList.removeAt(6)
dataList.removeAt(1)
val barcodeDataArray: Array<String> = dataList.toTypedArray()
for (i in itemArray.indices) {
val data: MutableMap<String, String> = HashMap()
data["item"] = itemArray[i]
data["barcodeData"] = barcodeDataArray[i]
list.add(data)
}
val listAdapter = SimpleAdapter(
applicationContext,
list,
R.layout.listview,
arrayOf<String>("item", "barcodeData"),
intArrayOf(R.id.textView1, R.id.textView2)
)
val listView = findViewById<ListView>(R.id.listView)
listView.adapter = listAdapter
(editTextNumber1 as TextView).text = dataList[4]
(editTextNumber2 as TextView).text = width
if (dataList[11] != "m3" || dataList[11] != "石") {
editTextNumber1.isEnabled = false
editTextNumber2.isEnabled = false
} else {
editTextNumber4.isEnabled = false
}
dataList.clear()
val textView5: TextView = findViewById(R.id.textView5)
textView5.text = "読取り結果表示"
button.isEnabled = true
}
}
}
}
override fun onResume() {
super.onResume()
registerReceiver(receiver, filter)
}
override fun onPause() {
super.onPause()
unregisterReceiver(receiver)
}
private fun startScanService() {
Intent().also { intent ->
intent.setAction("unitech.scanservice.start")
sendBroadcast(intent)
}
}
private fun closetScanToKey() {
Intent().also { intent ->
intent.setAction("unitech.scanservice.scan2key_setting")
intent.putExtras(Bundle().apply {
putBoolean("scan2key", false)
})
sendBroadcast(intent)
}
}
}
自分で試したこと
何卒よろしくお願い申し上げます。