需要数量只有软键盘?

时间:2013-02-26 21:33:39

标签: android android-softkeyboard ime android-input-method qwerty

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

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)
  5. 我总是在键盘上显示额外的字符,如:

    enter image description here

    setRawInputType(Configuration.KEYBOARD_12KEY)显示如下键盘:

    enter image description here

    非常感谢任何帮助。提前谢谢。

    注意:

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

7 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

我遇到了同样的问题,我发现没有像这样的安卓键盘 并且唯一的方法是实现自己的。 所以我想与您分享我的工具,希望能为您节省一些宝贵的时间:

  1. 我已经创建了这个xml,您可以根据需要修改键盘的颜色,字体和大小:

    <?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>
    
  2. enter image description here

    1. 我创建了这个片段:

              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--;
              }
          }
      
    2. 3.按下EditText时弹出键盘在效果下的效果 创建一个空的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。 / p>

      这是实现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的标准键盘我创建了一个CustomEditText,只需在:onCheckIsTextEditor()返回false,这是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;
      }
          }
      

      希望它帮助你... 如果您有改进建议,我将很高兴听到。 加仑

答案 2 :(得分:1)

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

答案 3 :(得分:0)

键盘本身会选择layout的键。您可以做的最好的事情是指定InputType.TYPE_CLASS_NUMBER,但键盘仍然会显示它认为适合数字文本字段的任何内容。

答案 4 :(得分: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倍,但是,我没有这个选项,因为我的客户想要标准键盘,天知道为什么......

希望它有所帮助!

答案 5 :(得分:0)

此解决方案通过覆盖EditText的默认转换方法以显示字符而不是点来使用numberPassword。

<EditText
    android:id="@+id/userid"
    android:inputType="numberPassword"
    android:maxLength="6"
/>

添加到OnCreate。

// Numeric 6 character user id
EditText input = findViewById(R.id.userid);

// Process input and show characters instead of dots
input.setTransformationMethod(SingleLineTransformationMethod.getInstance());

Numeric soft keyboard Image

答案 6 :(得分:0)

默认情况下,根据您的设备,数字键盘中的键盘也会显示特殊字符。为“文本”字段指定键盘类型,可以达到预期效果,例如

 InputFieldName.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);

如果只需要包含特殊字符的数字,则可以使用 InputType.TYPE_CLASS_NUMBER

如果您还需要排除那些特殊字符,请使用InputType.TYPE_NUMBER_VARIATION_PASSWORD