10

嗨,我需要一个只有数值的软键盘到和输入键。不应该显示除之外的任何内容。等等只需要数字软键盘?

enter image description here

我试过几个选项as suggested here但是没有什么似乎为我工作。

  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)

我总是多余的字符显示在键盘上一样:

enter image description here

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

enter image description here

希望得到任何帮助。提前致谢。

注:

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

setRawInputType(Configuration.KEYBOARD_12KEY)给你什么? – yarian 2013-02-26 21:51:10

+0

发布更新了截图。 – AKh 2013-02-26 21:56:42

回答

4

所有你能做的标准键盘都是建议输入类型。键盘仍然可以显示或不显示任何想要的键。如果你的必须有一定的键和只有那些,你需要创建一个自定义的软键盘。如果它仅适用于您的应用程序,并且特别是仅适用于一项活动,我实际上不会实现标准键盘,而只是使用执行相应操作的视图/按钮。

0

键盘本身选择什么键进行layout。您可以执行的最佳操作是指定InputType.TYPE_CLASS_NUMBER,但键盘仍会显示它认为适合数字文本字段的内容。

+0

谢谢。我可以提到程序中编辑文本中可以预期的输入类型吗? – AKh 2013-02-26 21:39:14

+0

所有设备上的锁定屏幕似乎只有这个数字键盘。任何想法,如果这些是系统键盘或定制内置? – AKh 2013-02-26 21:42:07

+2

他们是定制的。您始终可以编写自己的自定义键盘,但这并不值得您花很多时间。对于一个数字来说,你甚至可以做得更好,不会让它变成一个键盘,就像是一个巨大的计算器应用程序一样。我认为这就是他们所做的 - 键盘布局中的9个按钮,并在按钮的onClick中手动插入文本。 – 2013-02-26 21:43:12

1

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

+0

我试过了inputType =“phone”,就像你提到的那样,它仍然显示出那些额外的字符。我认为自定义键盘是要走的路。谢谢 – AKh 2013-02-26 21:48:21

0

我有,你有同样的问题,只是一个解决方案来了,也许它不是优雅,也不是它的简单,但它的工作灿烂......

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

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()); 

,正如前面所说,这不是最幸福的解决方案,但我向你保证,奇迹般有效。创建自己的自定义键盘要容易10倍,但是,我没有这个选项,因为我的客户想要标准键盘,天知道为什么...

希望它有帮助!

+0

设置numberPassword会让你放弃这个组件的自定义字体。 – 2017-09-07 20:11:48

4

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

  1. 我已经创建了这个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> 
    

enter image description here

  • 我已经创建该片段:

     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.效果按下时它被achived所述的EditText下一个空间PoPing键盘的由 创建一个空的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交流。 注意:托管活动必须实现此接口,否则将抛出ClassCastException。

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

    这是implemets键盘的活动:

     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非标准键盘我已经创建了一个简单的返回,在虚假的CustomEditText的空间PoPing: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; 
    } 
        } 
    

    希望它可以帮助你了... 如果你有改进的建议,我将很高兴听到。 Gal。

    +2

    这符合博客文章。 – Nirmal 2014-11-05 21:09:06

    +0

    非常感谢您的分享。 – Adamski 2015-01-03 18:32:32