只需要数字软键盘?
嗨,我需要一个只有数值的软键盘到和输入键。不应该显示除之外的任何内容。,()等等只需要数字软键盘?
我试过几个选项as suggested here但是没有什么似乎为我工作。
setRawInputType(Configuration.KEYBOARD_QWERTY)
setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED)
setRawInputType(InputType.TYPE_CLASS_NUMBER)
setRawInputType(InputType.TYPE_CLASS_PHONE)
我总是多余的字符显示在键盘上一样:
setRawInputType(Configuration.KEYBOARD_12KEY)
显示键盘这样的:
希望得到任何帮助。提前致谢。
注:
-
android:minSdkVersion="14"
:ICS4.0 -
android:targetSdkVersion="17"
:JB 4.2
所有你能做的标准键盘都是建议输入类型。键盘仍然可以显示或不显示任何想要的键。如果你的必须有一定的键和只有那些,你需要创建一个自定义的软键盘。如果它仅适用于您的应用程序,并且特别是仅适用于一项活动,我实际上不会实现标准键盘,而只是使用执行相应操作的视图/按钮。
键盘本身选择什么键进行layout
。您可以执行的最佳操作是指定InputType.TYPE_CLASS_NUMBER
,但键盘仍会显示它认为适合数字文本字段的内容。
除了在EditText上设置inputType =“phone”。一旦你开始输入,这将打开数字键盘键盘,但它将包括所有与数字相关的额外字符。您需要实现自己的键盘才能保留数字值。
我试过了inputType =“phone”,就像你提到的那样,它仍然显示出那些额外的字符。我认为自定义键盘是要走的路。谢谢 – AKh 2013-02-26 21:48:21
我有,你有同样的问题,只是一个解决方案来了,也许它不是优雅,也不是它的简单,但它的工作灿烂......
首先,唯一的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倍,但是,我没有这个选项,因为我的客户想要标准键盘,天知道为什么...
希望它有帮助!
设置numberPassword会让你放弃这个组件的自定义字体。 – 2017-09-07 20:11:48
我遇到了同样的问题,我发现有没有这种可用的Android键盘 ,唯一的办法就是实现自己的。 所以我想与大家分享我的实现,希望为你节省宝贵的时间:
-
我已经创建了这个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>
-
我已经创建该片段:
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。
setRawInputType(Configuration.KEYBOARD_12KEY)给你什么? – yarian 2013-02-26 21:51:10
发布更新了截图。 – AKh 2013-02-26 21:56:42