10

嗨,我需要一个只有数字值和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
4

7 回答 7

4

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

于 2013-02-26T21:44:11.797 回答
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>
    

在此处输入图像描述

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

3.EditText下弹出键盘的效果是通过创建一个空的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 交互与 Activity 通信。注意:托管活动必须实现此接口,否则将抛出 ClassCastException。

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

这是实现键盘的活动:

     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,它只在以下位置返回 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;
}
    }

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

于 2014-05-24T09:16:04.910 回答
1

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

于 2013-02-26T21:45:06.793 回答
1

此解决方案通过覆盖 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());

数字软键盘图像

于 2018-07-25T13:45:11.070 回答
1

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

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

IE

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

或者

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

于 2018-12-04T10:07:05.557 回答
0

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

于 2013-02-26T21:36:56.637 回答
0

我遇到了和你一样的问题,只是想出了一个解决方案,也许它不优雅,也不简单,但它确实工作得很好......

首先,唯一可以使用该键盘(至少在 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 倍,但是,我没有那个选项,因为我的客户想要标准键盘,天知道为什么......

希望它有所帮助!

于 2013-10-10T20:24:58.747 回答