需要数只有软键盘?(Need number only soft keyboard?)

2019-07-20 14:03发布

嗨,我需要一个软键盘,只有数值0〜9Enter键。 不应该表现出比这些像其他任何东西 ,()等...

我试了好几种选择如下建议 ,但没有任何事情似乎为我工作。

  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

Answer 1:

所有你能为标准键盘做的是表明输入类型。 键盘仍然可以显示或不显示它想要的任何键。 如果你必须有一定的钥匙,只有那些,你需要创建一个自定义的软键盘。 如果这只是你的应用程序,特别是如果它只是一个活动,我也不会真正实现一个标准键盘,但只是使用视图/该做相应的操作按钮。



Answer 2:

我遇到了同样的问题,我发现TAT没有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> 

  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--; } } 

当按下它是通过创建一个空的RelativeLayout作为容器到键盘发挥功能achived所述的EditText下一个空间PoPing键盘3.效果:

<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用户按我们的片段添加到容器中,当他按下一点,我们将其隐藏。 键盘片段comunicate与该onKeyBoardEvent interace活性的影响。 注:主办活动必须实现这个接口,否则一个ClassCastException将thown。

非常重要:我没有处理的方向变化,如果切换到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非标准键盘我已经创建了一个简单的返回false的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;
}
    }

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



Answer 3:

除了它设置的inputType =“手机”上的EditText。 一旦你开始打字但是它会包括与数字所有多余的字符,将打开数字键盘的键盘。 您需要实现自己的键盘仅保持数值。



Answer 4:

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

首先,这与键盘(至少到4.3)的作品中唯一的inputType是“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倍来创建自己的自定义键盘,但是,我没有这样的选择,因为我的客户想要的标准键盘,天知道为什么...

希望它帮助!



Answer 5:

键盘本身选择什么键进行layout 。 你能做的最好的就是指定InputType.TYPE_CLASS_NUMBER ,但键盘仍然会显示任何它认为是适当的数字文本字段。



Answer 6:

该解决方案通过重写的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());



Answer 7:

基于您的设备上默认情况下,键盘也表示在数字键盘的特殊字符。 指定文本字段键盘类型就可以达到预期的结果,如

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

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

要么

如果您需要排除这些特殊字符太然后使用InputType.TYPE_NUMBER_VARIATION_PASSWORD



文章来源: Need number only soft keyboard?