只需要数字软键盘?

您好,我需要一个只有数字值09的软键盘和回车键。 不应该显示除这些之外的任何东西 等…

在这里输入图像说明

我尝试了这里build议的几个选项,但没有看起来为我工作。

  1. setRawInputType(Configuration.KEYBOARD_QWERTY)
  2. setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED)
  3. setRawInputType(InputType.TYPE_CLASS_NUMBER)
  4. setRawInputType(InputType.TYPE_CLASS_PHONE)

我总是在键盘上显示额外的字符,如:

在这里输入图像说明

setRawInputType(Configuration.KEYBOARD_12KEY)显示一个像这样的键盘:

在这里输入图像说明

将不胜感激任何帮助。 提前致谢。

注意:

  • android:minSdkVersion="14" :ICS4.0
  • android:targetSdkVersion="17" :JB 4.2

Solutions Collecting From Web of "只需要数字软键盘?"

所有你能做的标准键盘是build议inputtypes。 键盘仍然可以显示或不显示任何想要的键。 如果您必须具有某些键并且只有这些键,则需要创build一个自定义软键盘。 如果只适用于您的应用程序,尤其是仅用于一个活动,我实际上不会实现标准键盘,而只是使用视图/button来执行相应的操作。

我遇到了同样的问题,我发现没有这样的Android键盘可用,唯一的办法就是实现自己的。 所以我想与你分享我的工具,并希望为您节省一些宝贵的时间:

  1. 我已经创build了这个XML,你可以修改颜色,字体和键盘大小accourding您的需要:

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="300dp" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" > <LinearLayout android:id="@+id/one_to_three" android:layout_width="match_parent" android:layout_height="60dp" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:orientation="horizontal" android:weightSum="3" > <Button android:id="@+id/one_btn" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:text="1" android:textSize="25sp" /> <Button android:id="@+id/two_btn" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:text="2" android:textSize="25sp" /> <Button android:id="@+id/three_btn" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:text="3" android:textSize="25sp" /> </LinearLayout> <LinearLayout android:id="@+id/four_to_six" android:layout_width="match_parent" android:layout_height="60dp" android:layout_below="@+id/one_to_three" android:orientation="horizontal" android:weightSum="3" > <Button android:id="@+id/four_btn" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:text="4" android:textSize="25sp" /> <Button android:id="@+id/five_btn" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:text="5" android:textSize="25sp" /> <Button android:id="@+id/six_btn" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:text="6" android:textSize="25sp" /> </LinearLayout> <LinearLayout android:id="@+id/seven_to_nine" android:layout_width="match_parent" android:layout_height="60dp" android:layout_below="@+id/four_to_six" android:orientation="horizontal" android:weightSum="3" > <Button android:id="@+id/seven_btn" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:text="7" android:textSize="25sp" /> <Button android:id="@+id/eight_btn" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:text="8" android:textSize="25sp" /> <Button android:id="@+id/nine_btn" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:text="9" android:textSize="25sp" /> </LinearLayout> <LinearLayout android:id="@+id/zero" android:layout_width="match_parent" android:layout_height="60dp" android:layout_below="@+id/seven_to_nine" android:orientation="horizontal" android:weightSum="3" > <Button android:id="@+id/zero_btn" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="2" android:text="0" android:textSize="25sp" /> <Button android:id="@+id/back_btn" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:text="Back" android:textSize="25sp" /> </LinearLayout> <LinearLayout android:id="@+id/done" android:layout_width="match_parent" android:layout_height="60dp" android:layout_below="@+id/zero" android:orientation="horizontal" > <Button android:id="@+id/done_btn" android:layout_width="match_parent" android:layout_height="match_parent" android:text="Done" android:textSize="30sp" /> </LinearLayout> </RelativeLayout> 

在这里输入图像说明

  1. 我创build了这个片段:

      package com.galrom.keyboard; //replace it with your package import com.example.calculator.R;//import your own R class import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.View.OnLongClickListener; import android.widget.Button; public class KeyBoardFragment extends Fragment { private Button one_btn; private Button two_btn; private Button three_btn; private Button four_btn; private Button five_btn; private Button six_btn; private Button seven_btn; private Button eight_btn; private Button nine_btn; private Button zero_btn; private Button back_btn; private Button done_btn; private StringBuilder sb; private onKeyBoardEvent keyboardEventListener; private int maxLength=10; private int currentLength; public static KeyBoardFragment newInstance(String EditTextValue) { KeyBoardFragment fragment=new KeyBoardFragment(); Bundle bundle=new Bundle(); bundle.putString("et_value", EditTextValue); fragment.setArguments(bundle); return fragment; } @Override public void onAttach(Activity activity) { try{ keyboardEventListener=(onKeyBoardEvent)activity; } catch(ClassCastException e) { Log.e("ClassCastException in KeyBoardFragment row 50",activity.toString()+" must implement onKeyboardEvent"); e.printStackTrace(); } super.onAttach(activity); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub sb=new StringBuilder(getArguments().getString("et_value")); currentLength=sb.length(); View rootView=inflater.inflate(R.layout.numeric_keyboard_layout, container, false); one_btn=(Button)rootView.findViewById(R.id.one_btn); one_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub add("1"); } }); two_btn=(Button)rootView.findViewById(R.id.two_btn); two_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { add("2"); } }); three_btn=(Button)rootView.findViewById(R.id.three_btn); three_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { add("3"); } }); four_btn=(Button)rootView.findViewById(R.id.four_btn); four_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { add("4"); } }); five_btn=(Button)rootView.findViewById(R.id.five_btn); five_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { add("5"); } }); six_btn=(Button)rootView.findViewById(R.id.six_btn); six_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { add("6"); } }); seven_btn=(Button)rootView.findViewById(R.id.seven_btn); seven_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { add("7"); } }); eight_btn=(Button)rootView.findViewById(R.id.eight_btn); eight_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { add("8"); } }); nine_btn=(Button)rootView.findViewById(R.id.nine_btn); nine_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { add("9"); } }); zero_btn=(Button)rootView.findViewById(R.id.zero_btn); zero_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(sb.length()>0) add("0"); } }); back_btn=(Button)rootView.findViewById(R.id.back_btn); back_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(sb.length()>0) { currentLength--; sb.deleteCharAt((sb.length())-1); keyboardEventListener.backButtonPressed(sb.toString()); } } }); back_btn.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { currentLength=0; sb=new StringBuilder(); keyboardEventListener.backLongPressed(); return false; } }); done_btn=(Button)rootView.findViewById(R.id.done_btn); done_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { keyboardEventListener.doneButtonPressed(sb.toString()); } }); return rootView; } public interface onKeyBoardEvent { public void numberIsPressed(String total); public void doneButtonPressed(String total); public void backLongPressed(); public void backButtonPressed(String total); } public int getMaxLength() { return maxLength; } public void setMaxLength(int maxLength) { this.maxLength = maxLength; } public void add(String num) { currentLength++; if(currentLength<=maxLength) { sb.append(num); keyboardEventListener.numberIsPressed(sb.toString()); } else currentLength--; } } 

3.当按下EditText时,popup键盘的作用是通过创build一个空的RelativeLayout来实现的,该空的RelativeLayout作为键盘的容器:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <com.galrom.keyboard.EditTextNoKeyBoard android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/Key_board_container" android:layout_centerHorizontal="true" android:clickable="true" android:ems="10" /> <RelativeLayout android:id="@+id/Key_board_container" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="38dp" android:background="#ffffff" > </RelativeLayout> 

当用户按下EditText时,我们将该片段添加到容器中,当他按下时,我们将其隐藏起来。 键盘片段用onKeyBoardEvent interace与Activity交stream。 注意:托pipe活动必须实现此接口,否则将出现ClassCastException。

非常重要的是:我没有处理方向改变,如果在键盘打开的时候改变为ladscape,它将会崩溃,所以要么禁用横向模式,要么处理方向改变以避免key_board_fragment上的nullPointerException。

这是执行keyBoard的Activity:

  package com.galrom.keyboard; import com.example.calculator.R; import android.content.res.Configuration; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends FragmentActivity implements KeyBoardFragment.onKeyBoardEvent{ private EditText et; private KeyBoardFragment keyboard_fragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et=(EditText)findViewById(R.id.editText1); et.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if(keyboard_fragment==null) { keyboard_fragment=KeyBoardFragment.newInstance(et.getText().toString()); getSupportFragmentManager().beginTransaction().add(R.id.Key_board_container, keyboard_fragment).commit(); } else { if(keyboard_fragment.isVisible()) getSupportFragmentManager().beginTransaction().hide(keyboard_fragment).commit(); else { keyboard_fragment=KeyBoardFragment.newInstance(et.getText().toString()); getSupportFragmentManager().beginTransaction().add(R.id.Key_board_container, keyboard_fragment).commit(); } } }); } @Override public void numberIsPressed(String total) { // TODO Auto-generated method stub et.setText(total); } @Override public void doneButtonPressed(String total) { // TODO Auto-generated method stub et.setText(total); if(keyboard_fragment.isVisible()) getSupportFragmentManager().beginTransaction().hide(keyboard_fragment).commit(); } @Override public void backLongPressed() { // TODO Auto-generated method stub et.setText(""); } @Override public void backButtonPressed(String total) { // TODO Auto-generated method stub et.setText(total); } @Override public void onBackPressed() { // TODO Auto-generated method stub if(keyboard_fragment!=null) { if(keyboard_fragment.isVisible()) getSupportFragmentManager().beginTransaction().remove(keyboard_fragment).commit(); else super.onBackPressed(); } else super.onBackPressed(); } } 

最后一件事:禁用Android的标准键盘的popup我创build了一个CustomEditText,它只是返回false在onCheckIsTextEditor(),这是CustomEditText类:

  package com.galrom.keyboard; import android.content.Context; import android.util.AttributeSet; import android.widget.EditText; public class EditTextNoKeyBoard extends EditText { public EditTextNoKeyBoard(Context context) { super(context); } public EditTextNoKeyBoard(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public EditTextNoKeyBoard(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onCheckIsTextEditor() { // TODO Auto-generated method stub return false; } } 

希望它帮助你…如果你有改进的build议,我会很高兴听到。 加尔。

除了在EditText上设置inputType =“phone” 。 一旦你开始input,这将打开数字键盘键盘,但它将包括所有与数字有关的额外字符。 您需要实现自己的键盘才能保留数字值。

我有同样的问题,你有,只是带来了一个解决scheme,也许它不优雅,也不容易,但它确实工作出色…

首先,与该键盘一起工作的唯一InputType(至less直到4.3)是“numberPassword”,但是这个“隐藏”你的input为点。 所以我用这个转换方法的input:

  private class ShowNumbersTransformationMethod implements TransformationMethod { public CharSequence getTransformation(final CharSequence charSequence, final View view) { return new PassCharSequence(charSequence); } @Override public void onFocusChanged(final View view, final CharSequence charSequence, final boolean b, final int i, final Rect rect) { //nothing to do here } private class PassCharSequence implements CharSequence { private final CharSequence charSequence; public PassCharSequence(final CharSequence charSequence) { this.charSequence = charSequence; } @Override public char charAt(final int index) { return charSequence.charAt(index); } @Override public int length() { return charSequence.length(); } @Override public CharSequence subSequence(final int start, final int end) { return new PassCharSequence(charSequence.subSequence(start, end)); } } } 

然后将其设置为您的edittext:

 edittext.setTransformationMethod(new ShowNumbersTransformationMethod()); 

现在,如前所述,这不是最快乐的解决scheme,但我向你保证它像一个魅力。 创build自己的自定义键盘会容易10倍,但是,我没有这个选项,因为我的客户想要标准键盘,天知道为什么…

希望它有帮助!

键盘本身selectlayout键。 最好的办法是指定InputType.TYPE_CLASS_NUMBER ,但是键盘仍然会显示任何它认为适合数字文本的字段。