EditText和EditText的聯(lián)動(dòng)、EditText和SeekBar的聯(lián)動(dòng)處理

前言

日常開發(fā)中丙猬,經(jīng)常需要監(jiān)聽(tīng)EditText的變化改變TextView涨颜。有的時(shí)候還有EditText和EditText聯(lián)動(dòng),EditText和SeekBar聯(lián)動(dòng)茧球,這種情況要注意避免死循環(huán)庭瑰,關(guān)鍵點(diǎn)是找到一個(gè)標(biāo)識(shí)來(lái)識(shí)別誰(shuí)影響誰(shuí),例如可以獲取焦點(diǎn)判斷抢埋,涉及到的知識(shí)點(diǎn)如下:

EditText.addTextChangeListener(...)  
EditText.setOnFocusChangeListener(...)
SeekBar.setOnSeekBarChangeListener(...)

相關(guān)知識(shí)

1.EditText.addTextChangeListener(...)

這個(gè)監(jiān)聽(tīng)有三個(gè)方法弹灭,大多是在onTextChanged()和afterTextChanged()處理督暂。經(jīng)過(guò)測(cè)試單字符輸入刪除、中間輸入刪除穷吮、多字符輸入刪除等逻翁,發(fā)現(xiàn)beforeTextChanged()和onTextChanged()的后面三個(gè)參數(shù)打印的數(shù)據(jù)是一一對(duì)應(yīng)的,即start - start捡鱼,count - before 八回,after - count。具體參數(shù)意思可看注釋驾诈,此處不舉例數(shù)據(jù)講解了缠诅。輸入emoji表情為啥count是2,可以看另一篇文章http://www.reibang.com/p/9434db689602

mEtPrice.addTextChangedListener(new TextWatcher() {
/**
* 輸入框改變前的內(nèi)容
* @param charSequence 輸入前字符串
* @param start 起始光標(biāo)
* @param count 刪除字符串的數(shù)量(這里的count是用str.length()計(jì)算的乍迄,因?yàn)閯h除一個(gè)emoji表情管引,count打印結(jié)果是 2)
* @param after 輸入框中改變后的字符串與起始位置的偏移量(也就是輸入字符串的length)
*/
@Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {

}

/**
* 輸入框改變后的內(nèi)容
* @param charSequence 字符串信息
* @param start 起始光標(biāo)
* @param before 輸入框中改變前的字符串與起始位置的偏移量(也就是刪除字符串的length)
* @param count 輸入字符串的數(shù)量(輸入一個(gè)emoji表情,count打印結(jié)果是2)
*/
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {

}

/**
* @param editable 輸入結(jié)束呈現(xiàn)在輸入框中的信息
*/
@Override
public void afterTextChanged(Editable editable) {

}
});
2.EditText.setOnFocusChangeListener(...)

判斷EditText是否獲取了焦點(diǎn)

mEtValueA.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
focusChangeFlag = b;
}
});
3.SeekBar.setOnSeekBarChangeListener(...)

SeekBar滑動(dòng)監(jiān)聽(tīng)就乓,代碼調(diào)用的setProgress(...)只會(huì)執(zhí)行onProgressChanged(...)這個(gè)方法汉匙,另外兩個(gè)方法不執(zhí)行,且參數(shù)fromUser為false生蚁。如果是用戶手動(dòng)拖動(dòng)噩翠,三個(gè)方法都會(huì)執(zhí)行,且fromUser返回true邦投。

mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
/**
* 進(jìn)度條改變事件
* @param seekBar
* @param progress 進(jìn)度條
* @param fromUser 是否是用戶操作伤锚,用戶手動(dòng)滑動(dòng)時(shí)-true,調(diào)用setProgress()-false
*/
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if(fromUser){ //是用戶操作,去影響EditText
mEtFloatRatio.setText(progress+"");
}
}

/**
* 進(jìn)度條開始拖動(dòng)事件
* @param seekBar
*/
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}

/**
* 進(jìn)度條停止拖動(dòng)事件(手指離開屏幕后)
* @param seekBar
*/
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});

實(shí)例

image.jpg
EditText和EditText聯(lián)動(dòng)

獲取EditTexti焦點(diǎn)判斷志衣,當(dāng)自身獲取到焦點(diǎn)時(shí)屯援,才去影響其他EditText,避免死循環(huán)念脯。

private boolean AFocusChangeFlag; //valueA焦點(diǎn)狀態(tài)
private boolean BFocusChangeFlag; //valueB焦點(diǎn)狀態(tài)


//1.焦點(diǎn)監(jiān)聽(tīng)事件
mEtValueA.setOnFocusChangeListener((view, b) -> AFocusChangeFlag = b);
mEtValueB.setOnFocusChangeListener((view, b) -> BFocusChangeFlag = b);


//2.mEtValueA.addTextChangedListener(...)的監(jiān)聽(tīng)
public void afterTextChanged(Editable editable) {
//首位為"" or 0狞洋,置1,輸入的數(shù)字從1開始
if (editable.toString().startsWith("0") || editable.toString().equals("") || editable.toString().startsWith(".")) {
mEtValueA.setText("1");
mEtValueA.setSelection(1);
return;
}
if(AFocusChangeFlag){ //編輯A的情況下绿店,去改變B
mEtValueB.setText(10000 - Integer.valueOf(editable.toString()) +"");
}
}

//3.mEtValueB.addTextChangedListener(...)的監(jiān)聽(tīng)
@Override
public void afterTextChanged(Editable editable) {
if (editable.toString().startsWith("0") || editable.toString().equals("") || editable.toString().startsWith(".")) {
mEtValueB.setText("1");
mEtValueB.setSelection(1);
return;
}
if(BFocusChangeFlag){ //編輯A的情況下吉懊,去改變B
mEtValueA.setText(10000 - Integer.valueOf(editable.toString()) +"");
}
}
EditText和SeekBar聯(lián)動(dòng)

兩種方式處理:
1.還是獲取EditText焦點(diǎn),但因?yàn)橥蟿?dòng)SeekBar的時(shí)候假勿,EditText沒(méi)有失去焦點(diǎn)借嗽,所以要自己去取消EditText的焦點(diǎn)。
2.判斷SeekBar是否是用戶手動(dòng)滑動(dòng)的转培,如果是才去影響EditText恶导。(推薦這種)

private int floatRatio; //浮動(dòng)比例,范圍 [0,100]


//1.mEt.addTextChangedListener(...)的方法
@Override
public void afterTextChanged(Editable editable) {
//允許輸入的范圍是[0,100]
String str = editable.toString();
if (str.startsWith("00") || str.equals("")) {
mEtFloatRatio.setText("0");
mEtFloatRatio.setSelection(1);
return;
}
floatRatio = Integer.valueOf(str);
if (floatRatio>100){
mEtFloatRatio.setText("100");
mEtFloatRatio.setSelection(3);
return;
}
//改變進(jìn)度條
mSeekBar.setProgress(floatRatio);
}

//2.mSeekBar.setOnSeekBarChangeListener(...)的方法
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if(fromUser){ //是用戶操作,去影響EditText
mEtFloatRatio.setText(progress+"");
}
}

EditText和SeekBar聯(lián)動(dòng)浸须,且有+惨寿,-按鈕

這種情況邦泄,不能只用fromUser來(lái)判斷了,因?yàn)辄c(diǎn)擊“+”“-”按鈕時(shí)裂垦,是要SeekBar去影響EditText虎韵,而此時(shí)是調(diào)用的setProgress(),fromUser返回的是false缸废。所以還是用EditText焦點(diǎn)去判斷包蓝,在用戶滑動(dòng)SeekBar、點(diǎn)擊"+","-"時(shí)失去焦點(diǎn)企量。這種處理方式其實(shí)用戶體驗(yàn)不好测萎,焦點(diǎn)跑別的輸入框去了。届巩。硅瞧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恕汇,隨后出現(xiàn)的幾起案子腕唧,更是在濱河造成了極大的恐慌,老刑警劉巖瘾英,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枣接,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缺谴,警方通過(guò)查閱死者的電腦和手機(jī)但惶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)湿蛔,“玉大人膀曾,你說(shuō)我怎么就攤上這事⊙羯叮” “怎么了添谊?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)察迟。 經(jīng)常有香客問(wèn)我斩狱,道長(zhǎng),這世上最難降的妖魔是什么卷拘? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任喊废,我火速辦了婚禮祝高,結(jié)果婚禮上栗弟,老公的妹妹穿的比我還像新娘。我一直安慰自己工闺,他們只是感情好乍赫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布瓣蛀。 她就那樣靜靜地躺著,像睡著了一般雷厂。 火紅的嫁衣襯著肌膚如雪惋增。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天改鲫,我揣著相機(jī)與錄音诈皿,去河邊找鬼。 笑死像棘,一個(gè)胖子當(dāng)著我的面吹牛稽亏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缕题,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼截歉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了烟零?” 一聲冷哼從身側(cè)響起瘪松,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锨阿,沒(méi)想到半個(gè)月后宵睦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡墅诡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年状飞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片书斜。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诬辈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出荐吉,到底是詐尸還是另有隱情焙糟,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布样屠,位于F島的核電站穿撮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏痪欲。R本人自食惡果不足惜悦穿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望业踢。 院中可真熱鬧栗柒,春花似錦、人聲如沸知举。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至逛钻,卻和暖如春僚焦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背曙痘。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工芳悲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人边坤。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓芭概,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親惩嘉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子罢洲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348