Pytanie Potrzebujesz tylko klawiatury numerycznej?


Cześć Potrzebuję miękkiej klawiatury z tylko wartościami liczbowymi 0 do 9 i Wchodzić klawisz. Nie powinien pokazywać niczego poza tymi jak .  ,  (  ) itp...

enter image description here

Próbowałem kilka opcji jak sugerowano tutaj ale nic nie działa dla mnie.

  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)

Zawsze mam dodatkowe znaki widoczne na klawiaturze, takie jak:

enter image description here

setRawInputType(Configuration.KEYBOARD_12KEY) pokazuje taką klawiaturę:

enter image description here

Doceniam każdą pomoc. Z góry dziękuję.

UWAGA:

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

11
2018-02-26 21:33


pochodzenie


Co daje ci setRawInputType (Configuration.KEYBOARD_12KEY)? - yarian
Po aktualizacji zrzutu ekranu. - AKh


Odpowiedzi:


Wszystko, co możesz zrobić dla standardowych klawiatur, to sugerowanie typów wejść. Klawiatura może nadal wyświetlać lub nie wyświetlać żądanych klawiszy. Jeśli ty musi mają pewne klucze i tylko te, musisz utworzyć niestandardową klawiaturę. Jeśli jest to tylko dla twojej aplikacji, a zwłaszcza jeśli jest to tylko jedna aktywność, to w rzeczywistości nie implementowałbym standardowej klawiatury, ale używałbym widoków / przycisków, które wykonują odpowiednie czynności.


4
2018-02-26 21:44





Stawiłem czoła temu samemu problemowi i znalazłem tat, nie ma takiej dostępnej klawiatury Android i że jedynym sposobem jest wdrożenie własnego. więc chciałbym się z wami podzielić moim narzędziem i mam nadzieję, że zaoszczędzicie cenny czas:

  1. Stworzyłem ten xml, możesz modyfikować kolory, czcionki i rozmiar klawiatury, zgodnie z Twoimi potrzebami:

    <?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

  1. Stworzyłem ten fragment:

            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. Efekt wyskakującej klawiatury pod EditText po naciśnięciu jest osiągany przez tworzenie pustego RelativeLayout, który pełni funkcję kontenera do klawiatury:

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

kiedy użytkownik nacisnął na EditText, dodaliśmy fragment do kontenera i kiedy naciśnie przycisk "Wykonaj", ukrywamy go. fragment klawiatury komunikuje się z działaniem z interakcją onKeyBoardEvent. UWAGA: działanie hostingu musi implementować ten interfejs, w przeciwnym razie zostanie zgłoszony wyjątek ClassCastException.

BARDZO WAŻNE: nie zmieniłem orientacji, jeśli zmienisz na ladscape, gdy klawiatura jest otwarta, zawiesi się, więc albo wyłącz tryb poziomy, albo zmień orientację, aby uniknąć wyjątku nullPointerException na key_board_fragment.

to jest Działanie, które implikuje tablicę 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();
}
       }

i ostatnia rzecz: Aby wyłączyć wyświetlanie standardowej klawiatury Androida, utworzyłem CustomEditText, który po prostu zwraca wartość false w: onCheckIsTextEditor (), jest to klasa 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;
}
    }

Mam nadzieję, że ci pomogło ... jeśli masz sugestie dotyczące ulepszeń, będę szczęśliwy, aby usłyszeć. Gal.


4
2018-05-24 09:16



To kwalifikuje się do postu na blogu. - Nirmal
Niesamowita odpowiedź dzięki za udostępnienie. - Adamski


Oprócz tego ustaw inputType = "phone" w EditText. Otworzy się klawiatura numeryczna po rozpoczęciu pisania, ale będzie zawierała wszystkie dodatkowe znaki związane z liczbami. Będziesz musiał zaimplementować własną klawiaturę, aby zachować tylko wartości liczbowe.


1
2018-02-26 21:45



Próbowałem inputType = "phone" i jak już wspomniałeś, nadal pokazywałem te dodatkowe znaki. Myślę, że niestandardowa klawiatura jest drogą do zrobienia. Dzięki - AKh


Miałem ten sam problem, który miałeś, i po prostu przyszedł z rozwiązaniem, być może nie jest elegancki, ani łatwy, ale działa wspaniale ...

Przede wszystkim, jedynym InputType, który działa z tą klawiaturą (przynajmniej do 4.3) jest "numberPassword", ale to "ukrywa" twoje dane wejściowe jako kropki. więc użyłem tego wejścia za pomocą tej metody transformacji:

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

a następnie ustaw go na swój editekst:

edittext.setTransformationMethod(new ShowNumbersTransformationMethod());

Jak powiedzieliśmy wcześniej, nie jest to najszczęśliwsze rozwiązanie, ale zapewniam cię, że działa jak urok. Byłoby to 10 razy łatwiejsze do stworzenia własnej niestandardowej klawiatury, ale nie miałem tej opcji, ponieważ mój klient chciał standardowej klawiatury, bóg wie, dlaczego ...

Mam nadzieję, że pomogło!


0
2017-10-10 20:24



Ustawienie numberPassword spowoduje utratę niestandardowej czcionki dla tego komponentu. - Cassio Landim


Klawiatura sama wybiera, jakie klawisze layout. Najlepsze, co możesz zrobić, to określić InputType.TYPE_CLASS_NUMBER, ale klawiatura nadal będzie wyświetlać wszystko, co uzna za stosowne w polach tekstowych.


0
2018-02-26 21:36



Dziękuję Ci. Czy mogę wymienić typ danych wejściowych, których można się spodziewać w tekście edycji w programie? - AKh
Wszystkie ekrany blokujące na wszystkich urządzeniach mają tę samą klawiaturę. Masz pomysł, czy są to klawisze systemowe, czy niestandardowe? - AKh
Są niestandardowe. Zawsze możesz napisać własną klawiaturę, ale nie jest to naprawdę warte dużo czasu. Jeśli chodzi o cyfry, może być nawet lepiej, nie robiąc z niego klawiatury i zachowując się jak gigantyczna aplikacja kalkulatora. Myślę, że to właśnie robią - 9 przycisków w układzie klawiatury i ręcznie wstaw tekst w przycisku onClick. - Gabe Sechan


To rozwiązanie używa numberPassword, zastępując domyślną metodę transformacji EditText, aby wyświetlać znaki zamiast kropek.

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

Dodaj do 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


0
2017-07-25 13:45