Нужна только номерная клавиатура?
Привет. Мне нужна мягкая клавиатура с числовыми значениями 0 до 9 и Enter. Не показывать ничего, кроме таких, как . , ( ) и т.д.
![enter image description 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)
У меня всегда появляются дополнительные символы на клавиатуре, например:
![enter image description here]()
setRawInputType(Configuration.KEYBOARD_12KEY)
показывает такую клавиатуру:
![enter image description here]()
Поблагодарили бы за любую помощь. Спасибо заранее.
ПРИМЕЧАНИЕ:
-
android:minSdkVersion="14"
: ICS4.0
-
android:targetSdkVersion="17"
: JB 4.2
Ответы
Ответ 1
Все, что вы можете сделать для стандартных клавиатур, предлагает типы ввода. Клавиатура может отображать или не отображать любые нужные ей клавиши. Если у вас есть определенные ключи и только те, вам нужно создать специальную мягкую клавиатуру. Если это только для вашего приложения, и особенно если это только для одного действия, я бы на самом деле не реализовал стандартную клавиатуру, а просто использовал view/buttons, которые выполняют соответствующие действия.
Ответ 2
Я столкнулся с той же проблемой, и я обнаружил, что нет такой клавиатуры для Android, как это доступно
и что единственный способ - реализовать свои собственные.
поэтому я хотел бы поделиться с вами своим опытом и, надеюсь, сэкономить вам некоторое время:
-
Я создал этот 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>
![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. Эффект всплывающей клавиатуры под 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.
ПРИМЕЧАНИЕ. Хостинг-активность должен реализовать этот интерфейс, иначе ClassCastException будет сохранен.
ОЧЕНЬ ВАЖНО: я не обработал изменение ориентации, если вы перейдете на ladscape, пока клавиатура открыта, он сработает, поэтому либо отключите ландшафтный режим, либо обработайте изменение ориентации, чтобы избежать исключения nullPointerException на key_board_fragment.
это действие, которое реализует keyBoard:
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;
}
}
Надеюсь, тебе это помогло...
если у вас есть предложения по улучшению, я буду рад услышать.
Гал.
Ответ 3
В дополнение к этому в EditText установите inputType = "phone" . Это откроет клавиатуру с цифровыми клавиатурами, как только вы начнете вводить текст, однако он будет содержать все дополнительные символы, связанные с числами. Вам нужно будет реализовать свою собственную клавиатуру, чтобы сохранить только числовые значения.
Ответ 4
Сама клавиатура выбирает ключи от layout
. Лучшее, что вы можете сделать, это указать InputType.TYPE_CLASS_NUMBER
, но клавиатура все равно отобразит то, что, по его мнению, соответствует цифровому текстовому полю.
Ответ 5
У меня была та же проблема, что и у вас, и только что пришло с решением, возможно, это не изящно и не просто, но оно прекрасно работает...
Прежде всего, единственный 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 раз проще создать собственную пользовательскую клавиатуру, но у меня не было этой опции, поскольку мой клиент хотел стандартную клавиатуру, бог знает, почему...
Надеюсь, что это помогло!
Ответ 6
Это решение использует numberPassword, переопределяя метод преобразования по умолчанию для EditText, чтобы показывать символы вместо точек.
<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]()
Ответ 7
По умолчанию на основе вашего устройства клавиатура показывает специальные символы на цифровой клавиатуре. указав тип клавиатуры для поля "Текст", вы можете достичь ожидаемого результата, например
InputFieldName.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
т.е.
Если вам нужен только номер, содержащий специальные символы, то вы можете использовать InputType.TYPE_CLASS_NUMBER
или же
если вам нужно также исключить эти специальные символы, используйте InputType.TYPE_NUMBER_VARIATION_PASSWORD