前提・実現したいこと
EditTextの入力欄がエンターを押すまで変化しないのを直したい
発生している問題・エラーメッセージ
フラグメントに設置したEditTextの入力欄が文字を入力しても変化しません。
エンターキー押す、フォーカスを外すことで入力した文字は表示されます。
EditTextのChangeListenerに他のViewへの反映について記入したのですが、これは入力中は一部だけしか動かず、エンターを押すことでやっと全て反映されます。
LinearLayoutに複数のEditTextを入れているのですが、一番上のEditTextは正常に働きます。
またAPI25で実施しても問題なく動作します。
該当のソースコード
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/mainLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".hero.MakingHero.MakedHeroA"> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="0.15" android:orientation="horizontal"> <Button android:id="@+id/samCount" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="0.2"/> </LinearLayout> <ImageButton android:id="@+id/heroImage" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_orange_light" android:focusable="true" android:focusableInTouchMode="true" android:src="@drawable/black_bow_front_circle" /> <LinearLayout android:id="@+id/stetusLayout" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="0.5" android:baselineAligned="false" android:orientation="horizontal"> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="0.6" android:orientation="vertical" android:visibility="visible"> <TextView android:id="@+id/hp" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> <TextView android:id="@+id/power" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> <TextView android:id="@+id/def" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:focusable="true" android:focusableInTouchMode="true"/> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="0.2" android:orientation="vertical"> <EditText android:id="@+id/plusHp" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="bottom|center" android:hint="@string/count0_50" android:inputType="number" android:lines="1" android:maxLength="2" android:nextFocusDown="@+id/def" android:nextFocusForward="@+id/def" /> <EditText android:id="@+id/plusPow" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="bottom|center" android:hint="@string/count0_50" android:inputType="number" android:lines="1" android:maxLength="2" android:nextFocusDown="@+id/def" android:nextFocusForward="@+id/def" /> </LinearLayout> </LinearLayout> </LinearLayout>
package com.example.word_battle.hero.MakingHero import android.content.Context import android.content.Intent import android.net.Uri import android.os.Bundle import android.text.Editable import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.text.TextWatcher import android.view.inputmethod.InputMethodManager import android.widget.EditText class MakedHeroA: Fragment(),TextWatcher { val textStetus = "%3s:%03d..+:%02d" fun sumCoun(sum:Int,count:Int):Int{ var sumX :Int = sum.minus(count) samCount.text="$sumX" return sumX } fun hpManage(A:Hero){ A.heroHp = A.hp+ A.hpCount hp.text = textStetus.format(" HP", A.heroHp, A.hpCount) hp.invalidate()} fun powManage(A:Hero){ A.heroPower = A.power+ A.powerCount power.text = textStetus.format("ATK", A.heroPower, A.powerCount)} fun heroMake(A: Hero, sum:Int, context:Context){ editForcus() heroX.name=A.name plusHp.setText(A.hpCount.toString()) plusPow.setText(A.powerCount.toString()) var hpCount=A.hpCount var powCount=A.powerCount var sumX = sum sumCoun(sumX,0) hpManage(A) powManage(A) //HP plusHp.addTextChangedListener(object :TextWatcher{//入力中の問題が起きない。 override fun afterTextChanged(s: Editable?) { val edit =s.toString() if(heroX.name!=A.name){return} if(!edit.equals("")&&edit.toInt() in 0..50){ val sa:Int = edit.toInt() - hpCount if(sumX-sa in 0..300){ sumX = sumCoun(sumX,sa) A.hpCount=edit.toInt() hpManage(A) hpCount=A.hpCount} } } }) //Power plusPow.addTextChangedListener(object :TextWatcher{//入力中の問題が起き、 viewもエンターを押さないと反映されない。 override fun afterTextChanged(s: Editable?) { val edit =s.toString() if(heroX.name!=A.name){return} if(!edit.equals("")&&edit.toInt() in 0..50){ val sa:Int = edit.toInt() - powCount if(sumX-sa in 0..300){ sumX = sumCoun(sumX,sa) A.powerCount=edit.toInt() powManage(A) powCount=A.powerCount} } ) } fun editForcus(){ val list= listOf<EditText>(plusHp,plusPow) list.forEach{ it.setOnFocusChangeListener { v, hasFocus -> if (!hasFocus) { val imm = activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.hideSoftInputFromWindow(v.windowToken, InputMethodManager.HIDE_NOT_ALWAYS) } }} heroImage?.setOnTouchListener { v, event -> heroImage?.requestFocus() mainLayout?.onTouchEvent(event) ?: true } } }
package com.example.word_battle.online class HeroMakerModeOnline: AppCompatActivity(){ private var A: Hero = Hero() private var B: Hero = Hero() private var sum: Int = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_hero_maker_mode) val fragment = (maker as? MakedHeroA)!! listButton = mutableListOf(button1,button2) button1.setOnClickListener { fragment?.heroMake(A, sum, this) } button2.setOnClickListener { fragment?.heroMake(B, sum, this) }} override fun onTouchEvent(event: MotionEvent?): Boolean { .requestFocus() mainlayout.requestFocus() return super.onTouchEvent(event) } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/mainlayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:focusable="true" android:focusableInTouchMode="true" tools:context= ".hero.MakingHero.HeroMakerModeWhite"> <LinearLayout android:id="@+id/higherLayout" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="0" android:orientation="horizontal" /> <LinearLayout android:id="@+id/centerLayout" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="0.08" android:orientation="horizontal"> <ImageButton android:id="@+id/button1" style="@android:style/Widget.Button" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> <ImageButton android:id="@+id/button2" style="@android:style/Widget.Button" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"/> </LinearLayout> <fragment android:id="@+id/maker" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="0.82" android:orientation="horizontal" android:name="com.example.word_battle.hero.MakingHero.MakedHeroA" tools:layout="@layout/fragment_maked_hero" /> </LinearLayout>
補足情報
androidstudio3.6.1
エミュレーター:ターゲットAndroid9.0,API28
よろしくお願いします。