這個(gè)問(wèn)題看似簡(jiǎn)單桑寨,不過(guò)由于Android輸入法的開放性,許多輸入法相關(guān)的參數(shù)設(shè)置是由第三方輸入法來(lái)實(shí)現(xiàn)的忿檩,而第三方輸入法眾多尉尾、實(shí)現(xiàn)不一,導(dǎo)致這個(gè)問(wèn)題變得很復(fù)雜燥透。
結(jié)論是沙咏,目前來(lái)看,并沒(méi)有直接的方法班套,可以對(duì)所有輸入法實(shí)現(xiàn)上述需求肢藐。
不過(guò)針對(duì)這個(gè)問(wèn)題,我們有以下幾種處理方案:
方案一 (適用于大部分中文輸入法)
設(shè)置android:digits屬性吱韭,允許輸入數(shù)字和字母吆豹。
設(shè)置android:inputType為"number",將鍵盤切換為數(shù)字鍵盤。
這里的關(guān)鍵是痘煤,雖然單獨(dú)設(shè)置android:inputType="number"時(shí)凑阶,只允許輸入數(shù)字;但同時(shí)設(shè)置android:inputType和android:digits時(shí)衷快,允許輸入的字符是以android:digits為準(zhǔn)的宙橱。
//配置EditText
<EditText
......
android:digits="@string/alphabet_and_number"
android:inputType="number" />
//修改string.xml
<resources>
......
<string name="alphabet_and_number">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789</string>
</resources>
當(dāng)輸入法本身的UI允許在數(shù)字鍵盤、字母鍵盤間切換時(shí)蘸拔,該方案是有效的养匈;但是一些輸入法的數(shù)字鍵盤不能切換到字母鍵盤,該方案失效都伪;特別是呕乎,Android5.0的原生輸入法就是如此,數(shù)字鍵盤UI沒(méi)有提供切換到其他鍵盤的按鈕陨晶。
雖然該方案對(duì)一些輸入法(尤其是英文輸入法)無(wú)效猬仁,但是中文輸入法基本都是有效的。如果APP僅在國(guó)內(nèi)用的先誉,這個(gè)方案夠用了
方案二 增加輸入法切換按鈕
方案一失效的主要原因是湿刽,輸入法界面中沒(méi)有提供切換鍵盤的按鍵,所以我們可以自己添上按鍵褐耳。
帶來(lái)的問(wèn)題是诈闺,自己添加按鍵,很難與輸入法保持統(tǒng)一的UI風(fēng)格铃芦;而當(dāng)輸入法本身有鍵盤切換按鍵時(shí)雅镊,這個(gè)方案是畫蛇添足,既怪異又不美觀刃滓。所以這個(gè)方案在UI上有嚴(yán)重缺陷仁烹,并不實(shí)用。
效果圖如下:
Activity如下:
package mobi.sherif.numberstexttextview;
import android.os.Bundle;
import android.app.Activity;
import android.text.InputType;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.widget.EditText;
public class MainActivity extends Activity {
EditText mEdit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEdit = (EditText) findViewById(R.id.input);
mEdit.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean focused) {
findViewById(R.id.llmenu).setVisibility(focused?View.VISIBLE:View.GONE);
}
});
}
public void onNumbers(View v) {
mEdit.setInputType(InputType.TYPE_CLASS_NUMBER);
}
public void onLetters(View v) {
mEdit.setInputType(InputType.TYPE_CLASS_TEXT);
}
}
activity_main.xml如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ScrollView
android:id="@+id/scrollview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignWithParentIfMissing="true"
android:layout_above="@+id/llmenu" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<EditText
android:id="@+id/input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number" >
<requestFocus />
</EditText>
</LinearLayout>
</ScrollView>
<LinearLayout
android:id="@+id/llmenu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="#000000"
android:padding="0dp" >
<Button
android:id="@+id/buttonnumbers"
android:layout_width="0dp"
android:onClick="onNumbers"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="Numbers" />
<Button
android:id="@+id/buttonletters"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:onClick="onLetters"
android:text="Letters" />
</LinearLayout>
</RelativeLayout>
方案三 自定義鍵盤
自定義鍵盤可以徹底解決問(wèn)題咧虎,是最完美的方案卓缰;但是復(fù)雜度有點(diǎn)高。
方案四 放棄默認(rèn)彈出數(shù)字鍵盤
默認(rèn)彈出數(shù)字鍵盤真的有那么重要么砰诵?沒(méi)有的話征唬,干脆不要折騰了,StackOverflow上那么多人已經(jīng)證明這個(gè)問(wèn)題無(wú)完美解了茁彭。
參考
http://stackoverflow.com/questions/3544214/edittext-with-number-keypad-by-default-but-allowing-alphabetic-characters
https://segmentfault.com/q/1010000004617428
http://blog.csdn.net/ccpat/article/details/46652921