今天遇到個需求,需要 EditText控件監(jiān)聽軟鍵盤的回車按鍵硬纤,將用戶寫下的多行文本提交到服務(wù)器解滓。
一開始以為是個簡單的要求,不過由于對EditText內(nèi)部機制的不了解筝家,導(dǎo)致比預(yù)期花多了不少時間去完成,特此記錄一下邻辉。
如果是對EditText內(nèi)部機制不熟悉的人的話溪王,一開始應(yīng)該會寫出類似我們下面的代碼:
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="120dp"
android:background="@drawable/input_box"
android:gravity="top|start"
android:imeOptions="actionDone"
android:padding="8dp" />
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText editText = (EditText) findViewById(R.id.editText);
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
Toast.makeText(MainActivity.this, "Commit!", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
});
}
然而當(dāng)我們運行上面的代碼,輸入一大串東西后就會發(fā)現(xiàn):
在xml設(shè)置的android:imeOptions="actionDone"怎么沒有起到作用值骇?怎么軟鍵盤的回車按鍵還是個換行符號的莹菱?
通過查詢各種資料,要讓EditText的imeOptions配置生效就必須設(shè)置下面兩個屬性中的一個:
android:singleLine="true"
android:inputType="text"
只要你設(shè)置了上面的任意一個(inputType屬性不一定是設(shè)置text類型的吱瘩,不過也不是全部的inputType類型都可以道伟,具體的請自己去嘗試),都可以讓imeOptions配置生效和完成軟鍵盤的回車鍵監(jiān)聽使碾。不過估計你也察覺到了蜜徽,上面兩個屬性,只要有一個在xml里面設(shè)置了票摇,那么EditText就失去換行的作用了>行!矢门!
解決的方法
由于需求是多行輸入盆色,無論是android:singleLine="true"還是android:inputType="text"都限制了只能單行,那么有什么方法可以突破text類型的單行限制嗎祟剔?當(dāng)然是有的隔躲,EditText繼承TextView,查看下TextView的setSingleLine方法可以看到一個applySingleLine方法物延,里面可以看到一些有趣的代碼:
setMaxLines方法大家應(yīng)該偶讀很熟悉了宣旱,setHorizontallyScrolling方法還是第一次見到,點進去看下注解:
好的教届,這樣子大概就知道了這個方法是設(shè)置文本能否超過View的寬度响鹃,如果是false,那么文本寬度最多只能是View的寬度案训。
看到這里买置,筆者第一時間在xml里面做了下面的設(shè)置:
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="120dp"
android:background="@drawable/input_box"
android:gravity="top|start"
android:imeOptions="actionDone"
android:singleLine="true"
android:maxLines="50"
android:scrollHorizontally="false"
android:padding="8dp" />
結(jié)果是不起作用的,猜測應(yīng)該是TextView在初始化屬性那邊將android:singleLine屬性放在了后面處理强霎,那么在Java代碼里面做處理會怎么樣:
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="120dp"
android:background="@drawable/input_box"
android:gravity="top|start"
android:imeOptions="actionDone"
android:singleLine="true"
android:padding="8dp" />
EditText editText = (EditText) findViewById(R.id.editText);
editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);
運行看下代碼:
ok忿项,問題解決了。