Jak stworzyć niestandardową klawiaturę w systemie Android?
105
Chcę zrobić niestandardową klawiaturę. Nie wiem, jak to zrobić za pomocą XML i Java. Poniższe zdjęcie przedstawia model klawiatury, którą chcę wykonać. Potrzebuje tylko liczb.
** Pamiętaj, że będziesz musiał utworzyć backspaceplik do rysowania i umieścić go w folderze res / drawable-ldpi o bardzo małym rozmiarze (np. 18x18 pikseli)
Następnie w pliku xml, którego chcesz użyć (gdzie znajduje się Twój TextView), powinieneś dodać następujący kod:
** Zauważ, że plik xml, który umieścisz android.inputmethodservice.KeyboardView, musi być RelativeLayout, aby móc ustawić alignParentBottom="true"(Zwykle klawiatury są prezentowane na dole ekranu)
Następnie musisz dodać następujący kod w onCreatefunkcji Activityobsługującej element TextView, do którego chcesz dołączyć klawiaturę
// Create the Keyboard
mKeyboard=newKeyboard(this,R.xml.keyboard);// Lookup the KeyboardView
mKeyboardView=(KeyboardView)findViewById(R.id.keyboardview);// Attach the keyboard to the view
mKeyboardView.setKeyboard( mKeyboard );// Do not show the preview balloons//mKeyboardView.setPreviewEnabled(false);// Install the key handler
mKeyboardView.setOnKeyboardActionListener(mOnKeyboardActionListener);
** Zauważ, że mKeyboardi mKeyboardViewsą to prywatne zmienne klasowe, które musisz utworzyć.
Następnie potrzebujesz następującej funkcji do otwierania klawiatury (musisz powiązać ją z TextView poprzez onClickwłaściwość xml)
I wreszcie potrzebujesz narzędzia OnKeyboardActionListener, które obsłuży Twoje wydarzenia
privateOnKeyboardActionListener mOnKeyboardActionListener =newOnKeyboardActionListener(){@Overridepublicvoid onKey(int primaryCode,int[] keyCodes){//Here check the primaryCode to see which key is pressed //based on the android:codes propertyif(primaryCode==1){Log.i("Key","You just pressed 1 button");}}@Overridepublicvoid onPress(int arg0){}@Overridepublicvoid onRelease(int primaryCode){}@Overridepublicvoid onText(CharSequence text){}@Overridepublicvoid swipeDown(){}@Overridepublicvoid swipeLeft(){}@Overridepublicvoid swipeRight(){}@Overridepublicvoid swipeUp(){}};
Ponieważ KeyboardView jest przestarzały od poziomu 29 interfejsu API, możesz znaleźć jego kod w tej witrynie i utworzyć klasę w kodzie przed zaimplementowaniem klawiatury, jak opisano powyżej.
A jeśli nie chcę, aby klawiatura znajdowała się u dołu ekranu? (np. chcę, aby użytkownik mógł go przeciągać). Czy jest to coś, co mogę kontrolować za pomocą aplikacji na klawiaturę, czy jest to obsługiwane przez system Android?
user3294126
szerokość klawiatury nie wypełnia ekranu, co powinienem zrobić, aby wypełniła wszystkie ekrany
George Thomas,
jaki jest układ nadrzędny, w którym znajduje się KeyboardView? Czy sprawdziłeś także layout_width w KeyboardView?
Pontios
1
Należy pamiętać, że klasy KeyboardView i Keyboard zostały wycofane przez Google od 29 poziomu interfejsu API. Dlatego to rozwiązanie nie będzie już działać w przyszłości, jeśli trzeba będzie kierować się na nowszy poziom interfejsu API.
maex
keyboardView został wycofany przez Google. co to jest nowe rozwiązanie?
tohidmahmoudvand
78
Klawiatura systemowa
W tej odpowiedzi opisano, jak utworzyć niestandardową klawiaturę systemową, której można używać w dowolnej aplikacji zainstalowanej przez użytkownika na telefonie. Jeśli chcesz stworzyć klawiaturę, która będzie używana tylko w Twojej aplikacji, zobacz moją drugą odpowiedź .
Poniższy przykład będzie wyglądał następująco. Możesz go zmodyfikować dla dowolnego układu klawiatury.
Poniższe kroki pokazują, jak utworzyć działającą niestandardową klawiaturę systemową. W miarę możliwości starałem się usunąć niepotrzebny kod. Jeśli potrzebujesz innych funkcji, na końcu zamieściłem linki do dalszej pomocy.
1. Uruchom nowy projekt Android
Nazwałem swój projekt „Klawiatura niestandardowa”. Nazwij to, jak chcesz. Nie ma tu nic specjalnego. Po prostu zostawię MainActivityi „Hello World!” układ, jaki jest.
2. Dodaj pliki układu
Dodaj następujące dwa pliki do res/layoutfolderu aplikacji :
keyboard_view.xml
key_preview.xml
keyboard_view.xml
Ten widok jest jak kontener, w którym znajdzie się nasza klawiatura. W tym przykładzie jest tylko jedna klawiatura, ale możesz dodać inne klawiatury i wymieniać je z niej KeyboardView.
Podgląd klawisza to układ, który pojawia się po naciśnięciu klawisza na klawiaturze. Pokazuje tylko, jaki klawisz naciskasz (na wypadek, gdybyś zakrywał go dużymi, grubymi palcami). To nie jest wyskakujące okienko wielokrotnego wyboru. W tym celu sprawdź widok Kandydaci .
keyWidth: To jest domyślna szerokość każdego klawisza. Te 20%pśrodki, które każdy klawisz powinien trwać 20% szerokości p Arent. Można go jednak zastąpić pojedynczymi klawiszami, jak widać z klawiszami Delete i Enter w trzecim rzędzie.
keyHeight: Jest tutaj zakodowany na sztywno, ale możesz użyć czegoś takiego, jak @dimen/key_heightustawić go dynamicznie dla różnych rozmiarów ekranu.
Gap: Pozioma i pionowa przerwa określa, ile wolnego miejsca między klawiszami. Nawet jeśli ustawisz to na, 0pxnadal jest mała luka.
codes: Może to być kod Unicode lub niestandardowa wartość kodu, która określa, co się dzieje lub co jest wprowadzane po naciśnięciu klawisza. Sprawdź, keyOutputTextczy chcesz wprowadzić dłuższy ciąg Unicode.
Utwórz nowy plik Java. Nazwijmy to MyInputMethodService. Ten plik łączy wszystko razem. Obsługuje dane wejściowe otrzymane z klawiatury i wysyła je do dowolnego widoku, który je otrzymuje ( EditTextna przykład).
publicclassMyInputMethodServiceextendsInputMethodServiceimplementsKeyboardView.OnKeyboardActionListener{@OverridepublicView onCreateInputView(){// get the KeyboardView and add our Keyboard layout to itKeyboardView keyboardView =(KeyboardView) getLayoutInflater().inflate(R.layout.keyboard_view,null);Keyboard keyboard =newKeyboard(this, R.xml.number_pad);
keyboardView.setKeyboard(keyboard);
keyboardView.setOnKeyboardActionListener(this);return keyboardView;}@Overridepublicvoid onKey(int primaryCode,int[] keyCodes){InputConnection ic = getCurrentInputConnection();if(ic ==null)return;switch(primaryCode){caseKeyboard.KEYCODE_DELETE:CharSequence selectedText = ic.getSelectedText(0);if(TextUtils.isEmpty(selectedText)){// no selection, so delete previous character
ic.deleteSurroundingText(1,0);}else{// delete the selection
ic.commitText("",1);}break;default:char code =(char) primaryCode;
ic.commitText(String.valueOf(code),1);}}@Overridepublicvoid onPress(int primaryCode){}@Overridepublicvoid onRelease(int primaryCode){}@Overridepublicvoid onText(CharSequence text){}@Overridepublicvoid swipeLeft(){}@Overridepublicvoid swipeRight(){}@Overridepublicvoid swipeDown(){}@Overridepublicvoid swipeUp(){}}
Uwagi:
W OnKeyboardActionListenernasłuchuje dane z klawiatury. Wymaga również wszystkich tych pustych metod w tym przykładzie.
To InputConnectionjest to, co jest używane do wysyłania danych wejściowych do innego widoku, takiego jak plik EditText.
5. Zaktualizuj manifest
Umieszczam to na końcu zamiast na początku, ponieważ odnosi się do plików, które już dodaliśmy powyżej. Aby zarejestrować klawiaturę niestandardową jako klawiaturę systemową, musisz dodać servicesekcję do pliku AndroidManifest.xml . Umieść to w applicationsekcji po activity.
Otóż to! Teraz powinieneś móc uruchomić swoją aplikację. Jednak niewiele zobaczysz, dopóki nie włączysz klawiatury w ustawieniach.
6. Włącz klawiaturę w Ustawieniach
Każdy użytkownik, który chce korzystać z Twojej klawiatury, będzie musiał ją włączyć w ustawieniach Androida. Aby uzyskać szczegółowe instrukcje, jak to zrobić, zobacz poniższy link:
Wybierz kolejno Ustawienia Androida> Języki i wprowadzanie> Bieżąca klawiatura> Wybierz klawiatury.
Na liście powinna pojawić się klawiatura niestandardowa. Odblokuj to.
Wróć i ponownie wybierz opcję Bieżąca klawiatura. Na liście powinna pojawić się klawiatura niestandardowa. Wybierz to.
Teraz powinieneś być w stanie używać klawiatury w dowolnym miejscu, w którym możesz wpisać Androida.
Dalsze badanie
Powyższa klawiatura jest użyteczna, ale aby stworzyć klawiaturę, której inne osoby będą chciały używać, prawdopodobnie będziesz musiał dodać więcej funkcji. Przeczytaj poniższe linki, aby dowiedzieć się, jak to zrobić.
Nie podoba ci się, jak standard KeyboardViewwygląda i zachowuje się? Ja na pewno nie. Wygląda na to, że nie był aktualizowany od czasu Androida 2.0. A co z tymi wszystkimi niestandardowymi klawiaturami w Sklepie Play? Nie wyglądają jak brzydka klawiatura powyżej.
Dobra wiadomość jest taka, że możesz całkowicie dostosować wygląd i zachowanie własnej klawiatury. Będziesz musiał wykonać następujące czynności:
Utwórz własny niestandardowy widok klawiatury, który obejmuje podklasy ViewGroup. Możesz wypełnić go Buttons lub nawet stworzyć własne niestandardowe widoki kluczy, które są podklasą View. Jeśli używasz widoków wyskakujących, zanotuj to .
Dodaj niestandardowy interfejs nasłuchiwania zdarzeń na klawiaturze. Wywołaj jego metody dla rzeczy takich jak onKeyClicked(String text)lub onBackspace().
Nie trzeba dodać keyboard_view.xml, key_preview.xmllub number_pad.xmlopisane w kierunkach wyżej, gdyż są to wszystko do normy KeyboardView. Zajmiesz się wszystkimi tymi aspektami interfejsu użytkownika w swoim niestandardowym widoku.
W swojej MyInputMethodServiceklasie zaimplementuj niestandardowy odbiornik klawiatury zdefiniowany w klasie klawiatury. Jest to miejsce KeyboardView.OnKeyboardActionListener, które nie jest już potrzebne.
W metodzie MyInputMethodServiceklasy onCreateInputView()utwórz i zwróć instancję klawiatury niestandardowej. Nie zapomnij ustawić niestandardowego nasłuchiwania klawiatury na this.
Ta odpowiedź wyjaśnia, jak skonfigurować niestandardową klawiaturę do użytku wyłącznie w aplikacji. Jeśli chcesz stworzyć klawiaturę systemową, której można używać w dowolnej aplikacji, zobacz moją drugą odpowiedź .
Przykład będzie wyglądał następująco. Możesz go zmodyfikować dla dowolnego układu klawiatury.
1. Uruchom nowy projekt Android
Nazwałam swój projekt InAppKeyboard. Zadzwoń, jak chcesz.
2. Dodaj pliki układu
Układ klawiatury
Dodaj plik układu do res/layoutfolderu. Zadzwoniłem do mnie keyboard. Klawiatura będzie niestandardowym widokiem złożonym , który zostanie nadmuchany z tego pliku układu xml. Możesz użyć dowolnego układu do rozmieszczenia klawiszy, ale ja używam LinearLayout. Zwróć uwagę na mergetagi.
Dla celów demonstracyjnych nasza aktywność ma jeden, EditTexta klawiatura jest na dole. Nazwałem niestandardowy widok klawiatury MyKeyboard. (Wkrótce dodamy ten kod, więc na razie zignoruj błąd). Zaletą umieszczenia całego kodu klawiatury w jednym widoku jest to, że ułatwia on ponowne użycie w innym działaniu lub aplikacji.
Dodaj nowy plik Java. Zadzwoniłem do mnie MyKeyboard.
Najważniejszą rzeczą, na którą należy tutaj zwrócić uwagę, jest to, że nie ma stałego połączenia z żadnym EditTextlub Activity. Ułatwia to podłączenie go do dowolnej aplikacji lub działania, które tego potrzebuje. Ten niestandardowy widok klawiatury używa również znaku InputConnection, który naśladuje sposób, w jaki klawiatura systemowa komunikuje się z plikiem EditText. W ten sposób unikamy twardych linków.
MyKeyboard jest widokiem złożonym, który rozszerza układ widoku, który zdefiniowaliśmy powyżej.
MyKeyboard.java
publicclassMyKeyboardextendsLinearLayoutimplementsView.OnClickListener{// constructorspublicMyKeyboard(Context context){this(context,null,0);}publicMyKeyboard(Context context,AttributeSet attrs){this(context, attrs,0);}publicMyKeyboard(Context context,AttributeSet attrs,int defStyleAttr){super(context, attrs, defStyleAttr);
init(context, attrs);}// keyboard keys (buttons)privateButton mButton1;privateButton mButton2;privateButton mButton3;privateButton mButton4;privateButton mButton5;privateButton mButton6;privateButton mButton7;privateButton mButton8;privateButton mButton9;privateButton mButton0;privateButton mButtonDelete;privateButton mButtonEnter;// This will map the button resource id to the String value that we want to // input when that button is clicked.SparseArray<String> keyValues =newSparseArray<>();// Our communication link to the EditTextInputConnection inputConnection;privatevoid init(Context context,AttributeSet attrs){// initialize buttonsLayoutInflater.from(context).inflate(R.layout.keyboard,this,true);
mButton1 =(Button) findViewById(R.id.button_1);
mButton2 =(Button) findViewById(R.id.button_2);
mButton3 =(Button) findViewById(R.id.button_3);
mButton4 =(Button) findViewById(R.id.button_4);
mButton5 =(Button) findViewById(R.id.button_5);
mButton6 =(Button) findViewById(R.id.button_6);
mButton7 =(Button) findViewById(R.id.button_7);
mButton8 =(Button) findViewById(R.id.button_8);
mButton9 =(Button) findViewById(R.id.button_9);
mButton0 =(Button) findViewById(R.id.button_0);
mButtonDelete =(Button) findViewById(R.id.button_delete);
mButtonEnter =(Button) findViewById(R.id.button_enter);// set button click listeners
mButton1.setOnClickListener(this);
mButton2.setOnClickListener(this);
mButton3.setOnClickListener(this);
mButton4.setOnClickListener(this);
mButton5.setOnClickListener(this);
mButton6.setOnClickListener(this);
mButton7.setOnClickListener(this);
mButton8.setOnClickListener(this);
mButton9.setOnClickListener(this);
mButton0.setOnClickListener(this);
mButtonDelete.setOnClickListener(this);
mButtonEnter.setOnClickListener(this);// map buttons IDs to input strings
keyValues.put(R.id.button_1,"1");
keyValues.put(R.id.button_2,"2");
keyValues.put(R.id.button_3,"3");
keyValues.put(R.id.button_4,"4");
keyValues.put(R.id.button_5,"5");
keyValues.put(R.id.button_6,"6");
keyValues.put(R.id.button_7,"7");
keyValues.put(R.id.button_8,"8");
keyValues.put(R.id.button_9,"9");
keyValues.put(R.id.button_0,"0");
keyValues.put(R.id.button_enter,"\n");}@Overridepublicvoid onClick(View v){// do nothing if the InputConnection has not been set yetif(inputConnection ==null)return;// Delete text or input key value// All communication goes through the InputConnectionif(v.getId()== R.id.button_delete){CharSequence selectedText = inputConnection.getSelectedText(0);if(TextUtils.isEmpty(selectedText)){// no selection, so delete previous character
inputConnection.deleteSurroundingText(1,0);}else{// delete the selection
inputConnection.commitText("",1);}}else{Stringvalue= keyValues.get(v.getId());
inputConnection.commitText(value,1);}}// The activity (or some parent or controller) must give us // a reference to the current EditText's InputConnectionpublicvoid setInputConnection(InputConnection ic){this.inputConnection = ic;}}
4. Skieruj klawiaturę na EditText
W przypadku klawiatur systemowych system Android używa InputMethodManager, aby wskazać klawiaturę na fokus EditText. W tym przykładzie działanie zajmie jego miejsce, podając łącze z EditTextnaszej klawiatury niestandardowej do.
Ponieważ nie używamy klawiatury systemowej, musimy ją wyłączyć, aby nie pojawiała się po dotknięciu EditText. Po drugie, musimy pobrać go InputConnectionz EditTexti przekazać do naszej klawiatury.
MainActivity.java
publicclassMainActivityextendsAppCompatActivity{@Overrideprotectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);EditText editText =(EditText) findViewById(R.id.editText);MyKeyboard keyboard =(MyKeyboard) findViewById(R.id.keyboard);// prevent system keyboard from appearing when EditText is tapped
editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
editText.setTextIsSelectable(true);// pass the InputConnection from the EditText to the keyboardInputConnection ic = editText.onCreateInputConnection(newEditorInfo());
keyboard.setInputConnection(ic);}}
Jeśli Twoja aktywność ma wiele tekstów edycji, będziesz musiał napisać kod, aby przekazać odpowiednie teksty edycji InputConnectiondo klawiatury. (Możesz to zrobić, dodając OnFocusChangeListeneri OnClickListenerdo EditTexts. Zobacz ten artykuł, aby omówić ten temat). Możesz także chcieć ukryć lub pokazać klawiaturę w odpowiednim momencie.
Skończone
Otóż to. Powinieneś móc teraz uruchomić przykładową aplikację i wprowadzić lub usunąć tekst zgodnie z potrzebami. Następnym krokiem jest zmodyfikowanie wszystkiego, aby dopasować je do własnych potrzeb. Na przykład w niektórych moich klawiaturach użyłem TextViews zamiast przycisków, ponieważ łatwiej jest je dostosować.
Uwagi
W pliku układu xml możesz również użyć TextViewraczej a, Buttonjeśli chcesz, aby klucze wyglądały lepiej. Następnie po prostu ustaw tło, które można narysować, a po naciśnięciu zmieni stan wyglądu.
Zaawansowane klawiatury niestandardowe: aby uzyskać większą elastyczność w wyglądzie i przełączaniu klawiatury, teraz tworzę niestandardowe widoki klawiszy, które są podklasami, Viewa niestandardowe klawiatury są podklasami ViewGroup. Klawiatura rozkłada wszystkie klawisze programowo. Klawisze wykorzystują interfejs do komunikacji z klawiaturą (podobnie jak fragmenty komunikują się z działaniem). Nie jest to konieczne, jeśli potrzebujesz tylko jednego układu klawiatury, ponieważ układ xml działa dobrze do tego. Ale jeśli chcesz zobaczyć przykład tego, nad czym pracowałem, sprawdź wszystkie Key*i Keyboard*zajęcia tutaj . Zauważ, że używam tam również widoku kontenera, którego funkcją jest włączanie i wyłączanie klawiatur.
Twoja odpowiedź jest świetna, ale jak możemy ustawić przełączanie między oryginalną klawiaturą a nową klawiaturą.
Kishan Donga
@KishanDonga, Na swojej klawiaturze możesz dodać klawisz do przełączania klawiatur. Gdy użytkownik naciśnie, zadzwoń InputMethodManager#showInputMethodPicker(). Jeśli jednak oryginalna klawiatura nie ma takiego klawisza, jedynym sposobem, w jaki użytkownicy mogą przełączyć się na klawiaturę, jest zrobienie tego ręcznie w ustawieniach systemu. Apple jest lepszy od Androida w tej dziedzinie, ponieważ Apple wymaga, aby wszystkie klawiatury miały klawisz przełączania klawiatury.
Suragch
@KishanDonga, właśnie zdałem sobie sprawę, że ta odpowiedź dotyczy klawiatury w aplikacji, a nie klawiatury systemowej. Jeśli chcesz przełączać się między dwiema niestandardowymi klawiaturami, możesz programowo zamieniać je w widoku kontenera i poza nim. Po prostu dodaj klawisz zamiany klawiatur na obu klawiaturach. Zobacz moją notatkę „zaawansowane klawiatury niestandardowe” i link w powyższej odpowiedzi.
Suragch
Jeśli chcesz przełączać się między klawiaturą a klawiaturą systemową, ukryj klawiaturę systemową i wyświetlaj ją w odpowiednich momentach (i odwrotnie).
Suragch
1
@MarekTakac, będziesz musiał wyłączyć klawiaturę systemową i dodać własną klawiaturę w każdej czynności. Jeśli działanie ma wiele EditTexts, będziesz musiał dodać onFocusChangedListenerdo nich znak, aby po uzyskaniu fokusu można było przypisać InputConnectionod bieżącego EditTextdo niestandardowej klawiatury.
Fajną rzeczą w tym jest to, że R.xml.customodnosi się do /res/xml/custom.xml, który definiuje w xml układ klawiatury. Więcej informacji na temat tego pliku można znaleźć tutaj: Keyboard , Keyboard.Row , Keyboard.Key .
Twoje powinny znajdować się w tych samych wierszach z innym układem.
Edycja: Jeśli potrzebujesz klawiatury tylko w swojej aplikacji, jest to bardzo proste! Utwórz układ liniowy z orientacją pionową i utwórz w nim 3 układy liniowe z orientacją poziomą. Następnie umieść przyciski z każdego wiersza w każdym z tych poziomych układów liniowych i przypisz do przycisków właściwość wagi. Użyj android: layout_weight = 1 dla wszystkich, aby były równomiernie rozmieszczone.
To rozwiąże. Jeśli nie otrzymałeś tego, czego się spodziewałeś, prześlij kod tutaj, a my jesteśmy tutaj, aby Ci pomóc!
Edycja jest w rzeczywistości zła, ponieważ oznaczałoby to, że klawiatura jest zawsze wyświetlana i nie będzie zachowywać się jak standardowa klawiatura Androida.
m0skit0
6
Jeden z najlepiej udokumentowanych przykładów, jakie znalazłem.
Niedawno natknąłem się na ten post, gdy próbowałem zdecydować, jakiej metody użyć do stworzenia własnej niestandardowej klawiatury. Uznałem, że API systemu Android jest bardzo ograniczone, więc zdecydowałem się stworzyć własną klawiaturę w aplikacji. Wykorzystując odpowiedź Suragcha jako podstawę moich badań, przystąpiłem do zaprojektowania własnego komponentu klawiatury . Jest opublikowany na GitHub z licencją MIT. Miejmy nadzieję, że zaoszczędzi to komuś dużo czasu i bólu głowy.
Architektura jest dość elastyczna. Istnieje jeden widok główny (CustomKeyboardView), który można wstrzyknąć za pomocą dowolnego układu klawiatury i kontrolera.
Musisz tylko zadeklarować CustomKeyboardView w swoim pliku XML aktywności (możesz to również zrobić programowo):
Następnie zarejestruj w nim swój EditText i powiedz, jakiego typu klawiatury mają używać:
override fun onCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val numberField:EditText= findViewById(R.id.testNumberField)
val numberDecimalField:EditText= findViewById(R.id.testNumberDecimalField)
val qwertyField:EditText= findViewById(R.id.testQwertyField)
keyboard = findViewById(R.id.customKeyboardView)
keyboard.registerEditText(CustomKeyboardView.KeyboardType.NUMBER, numberField)
keyboard.registerEditText(CustomKeyboardView.KeyboardType.NUMBER_DECIMAL, numberDecimalField)
keyboard.registerEditText(CustomKeyboardView.KeyboardType.QWERTY, qwertyField)}
CustomKeyboardView obsługuje resztę!
Mam piłkę za pomocą klawiatury Number, NumberDecimal i QWERTY. Zapraszam do pobrania i tworzenia własnych układów i kontrolerów. To wygląda tak:
Nawet jeśli nie jest to architektura, na którą zdecydujesz się wybrać, miejmy nadzieję, że pomocne będzie zapoznanie się z kodem źródłowym działającej klawiatury w aplikacji.
Cóż, Suragch udzielił jak dotąd najlepszej odpowiedzi, ale pominął pewne drobne rzeczy, które były ważne przy kompilacji aplikacji.
Mam nadzieję dać lepszą odpowiedź niż Suragch, poprawiając jego odpowiedź. Dodam wszystkie brakujące elementy, których nie umieścił.
Skompilowałem mój apk za pomocą aplikacji na Androida, APK Builder 1.1.0. Więc zacznijmy.
Aby zbudować aplikację na Androida, potrzebujemy kilku plików i folderów, które są uporządkowane w określonym formacie i odpowiednio pisane wielkimi literami.
res layout -> pliki xml przedstawiające wygląd aplikacji na telefonie. Podobnie jak HTML kształtuje wygląd strony internetowej w przeglądarce. Zezwalanie na odpowiednie dopasowanie aplikacji do ekranów.
wartości -> stałe dane, takie jak colors.xml, strings.xml, styles.xml. Te pliki muszą mieć poprawną pisownię.
do rysowania -> zdjęcia {jpeg, png, ...}; Nazwij je dowolnie.
mipmap -> więcej fotek. używany do ikony aplikacji?
xml -> więcej plików xml.
src -> działa jak JavaScript w html. Pliki układu zainicjują widok początkowy, a plik java będzie dynamicznie kontrolować elementy znaczników i zdarzenia wyzwalające. Zdarzenia można również aktywować bezpośrednio w pliku layout.xml, tak jak w html.
AndroidManifest.xml -> Ten plik rejestruje, o czym jest Twoja aplikacja. Nazwa aplikacji, typ programu, wymagane uprawnienia itp. To sprawia, że Android jest raczej bezpieczny. Programy dosłownie nie mogą zrobić tego, o co nie poprosiły w Manifeście.
Obecnie istnieją 4 typy programów na Androida: aktywność, usługa, dostawca treści i odbiorca transmisji. Nasza klawiatura będzie usługą umożliwiającą jej działanie w tle. Nie pojawi się na liście aplikacji do uruchomienia; ale można go odinstalować.
Skompilowanie aplikacji obejmuje Gradle i podpisywanie APK. Możesz go zbadać lub użyć aplikacji APK Builder dla Androida. To bardzo proste.
Teraz, gdy rozumiemy rozwój Androida, stwórzmy pliki i foldery.
Utwórz pliki i foldery, jak omówiłem powyżej. Mój katalog będzie wyglądał następująco:
NumPad
AndroidManifest.xml
src
Saragch
num_pad
MyInputMethodService.java
res
do rysowania
Suragch_NumPad_icon.png
układ
key_preview.xml
keyboard_view.xml
xml
method.xml
number_pad.xml
wartości
colors.xml
strings.xml
style.xml
Pamiętaj, że jeśli używasz ide, takiego jak Android Studio, może on zawierać plik projektu.
Oczywiście można to łatwo edytować według własnych upodobań. Możesz nawet użyć obrazów zamiast słów dla etykiety.
Suragch nie zademonstrował plików w folderze wartości i założył, że mamy dostęp do Android Studio; która automatycznie je tworzy. Dobrze, że mam APK Builder.
<resources><!-- Base application theme. --><stylename="AppTheme"parent="android:Theme.Material.Light.DarkActionBar"><!-- Customize your theme here.--></style></resources>
H: Numpad / AndroidManifest.xml
To jest plik, który naprawdę czekał na rywalizację. Tutaj poczułem, że nigdy nie skompiluję swojego programu. szloch. szloch. Jeśli zaznaczysz odpowiedź Suracgha, zobaczysz, że pozostawia pierwszy zestaw pól pustych i dodaje znacznik aktywności w tym pliku. Jak powiedziałem, istnieją cztery rodzaje programów na Androida. Aktywność to zwykła aplikacja z ikoną programu uruchamiającego. Ten numpad nie jest zajęciem! Ponadto nie podejmował żadnych działań.
Moi przyjaciele nie dołączają tagu aktywności. Twój program się skompiluje, a przy próbie uruchomienia ulegnie awarii! Jeśli chodzi o xmlns: android i uses-sdk; Nie mogę ci tam pomóc. Po prostu wypróbuj moje ustawienia, jeśli działają.
Jak widać, istnieje tag serwisowy, który rejestruje go jako usługę. Również service.android:name musi być nazwą usługi rozszerzającej klasę publiczną w naszym pliku java. MUSI być odpowiednio wielką literą. Pakiet jest również nazwą pakietu, który zadeklarowaliśmy w pliku java.
To był kolejny problem, ale nie tak sporny jak plik manifestu. Ponieważ znam Javę na tyle dobrze, że wiem, co jest czym, a co nie. Ledwo znam xml i jak to się wiąże z programowaniem na Androida!
Problem polegał na tym, że niczego nie importował! To znaczy, dał nam „kompletny” plik, który używa nazw, których nie można było rozwiązać! InputMethodService, Keyboard, itp. To zła praktyka, panie Suragch. Dziękuję za pomoc, ale jak spodziewałeś się kompilacji kodu, jeśli nazwy nie mogą zostać rozwiązane?
Poniżej znajduje się poprawnie zredagowana wersja. Po prostu natknąłem się na kilka wskazówek, które doprowadziły mnie we właściwe miejsce, aby dowiedzieć się, co dokładnie zaimportować.
packageSaragch.num_pad;import android.inputmethodservice.InputMethodService;import android.inputmethodservice.KeyboardView;import android.inputmethodservice.Keyboard;import android.text.TextUtils;import android.view.inputmethod.InputConnection;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager;import android.os.Build;import android.os.Bundle;import android.view.View;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;publicclassMyInputMethodServiceextendsInputMethodServiceimplementsKeyboardView.OnKeyboardActionListener{@OverridepublicView onCreateInputView(){// get the KeyboardView and add our Keyboard layout to itKeyboardView keyboardView =(KeyboardView)getLayoutInflater().inflate(R.layout.keyboard_view,null);Keyboard keyboard =newKeyboard(this, R.xml.number_pad);
keyboardView.setKeyboard(keyboard);
keyboardView.setOnKeyboardActionListener(this);return keyboardView;}@Overridepublicvoid onKey(int primaryCode,int[] keyCodes){InputConnection ic = getCurrentInputConnection();if(ic ==null)return;switch(primaryCode){caseKeyboard.KEYCODE_DELETE:CharSequence selectedText = ic.getSelectedText(0);if(TextUtils.isEmpty(selectedText)){// no selection, so delete previous character
ic.deleteSurroundingText(1,0);}else{// delete the selection
ic.commitText("",1);}
ic.deleteSurroundingText(1,0);break;default:char code =(char) primaryCode;
ic.commitText(String.valueOf(code),1);}}@Overridepublicvoid onPress(int primaryCode){}@Overridepublicvoid onRelease(int primaryCode){}@Overridepublicvoid onText(CharSequence text){}@Overridepublicvoid swipeLeft(){}@Overridepublicvoid swipeRight(){}@Overridepublicvoid swipeDown(){}@Overridepublicvoid swipeUp(){}}
Skompiluj i podpisz swój projekt.
W tym miejscu nie mam pojęcia, jako początkujący programista Android. Chciałbym nauczyć się tego ręcznie, ponieważ uważam, że prawdziwi programiści mogą kompilować ręcznie.
Myślę, że gradle jest jednym z narzędzi do kompilowania i pakowania do apk. apk wygląda jak plik jar lub rar dla pliku zip. Istnieją zatem dwa rodzaje podpisów. klucz debugowania, który nie jest dozwolony w sklepie Play i klucz prywatny.
Pomóżmy panu Saragchowi. Dziękuję za obejrzenie mojego filmu. Polub, zasubskrybuj.
Odpowiedzi:
Przede wszystkim będziesz potrzebował
keyboard.xml
pliku, który zostanie umieszczony wres/xml
folderze (jeśli folder nie istnieje, utworzył go).** Pamiętaj, że będziesz musiał utworzyć
backspace
plik do rysowania i umieścić go w folderze res / drawable-ldpi o bardzo małym rozmiarze (np. 18x18 pikseli)Następnie w pliku xml, którego chcesz użyć (gdzie znajduje się Twój TextView), powinieneś dodać następujący kod:
** Zauważ, że plik xml, który umieścisz
android.inputmethodservice.KeyboardView
, musi byćRelativeLayout
, aby móc ustawićalignParentBottom="true"
(Zwykle klawiatury są prezentowane na dole ekranu)Następnie musisz dodać następujący kod w
onCreate
funkcjiActivity
obsługującej elementTextView
, do którego chcesz dołączyć klawiaturę** Zauważ, że
mKeyboard
imKeyboardView
są to prywatne zmienne klasowe, które musisz utworzyć.Następnie potrzebujesz następującej funkcji do otwierania klawiatury (musisz powiązać ją z TextView poprzez
onClick
właściwość xml)I wreszcie potrzebujesz narzędzia
OnKeyboardActionListener
, które obsłuży Twoje wydarzeniaMam nadzieję, że to pomoże !!!
Większość kodu znalezionego tutaj
____________________________________________________________-
EDYTOWAĆ:
Ponieważ KeyboardView jest przestarzały od poziomu 29 interfejsu API, możesz znaleźć jego kod w tej witrynie i utworzyć klasę w kodzie przed zaimplementowaniem klawiatury, jak opisano powyżej.
źródło
Klawiatura systemowa
W tej odpowiedzi opisano, jak utworzyć niestandardową klawiaturę systemową, której można używać w dowolnej aplikacji zainstalowanej przez użytkownika na telefonie. Jeśli chcesz stworzyć klawiaturę, która będzie używana tylko w Twojej aplikacji, zobacz moją drugą odpowiedź .
Poniższy przykład będzie wyglądał następująco. Możesz go zmodyfikować dla dowolnego układu klawiatury.
Poniższe kroki pokazują, jak utworzyć działającą niestandardową klawiaturę systemową. W miarę możliwości starałem się usunąć niepotrzebny kod. Jeśli potrzebujesz innych funkcji, na końcu zamieściłem linki do dalszej pomocy.
1. Uruchom nowy projekt Android
Nazwałem swój projekt „Klawiatura niestandardowa”. Nazwij to, jak chcesz. Nie ma tu nic specjalnego. Po prostu zostawię
MainActivity
i „Hello World!” układ, jaki jest.2. Dodaj pliki układu
Dodaj następujące dwa pliki do
res/layout
folderu aplikacji :keyboard_view.xml
Ten widok jest jak kontener, w którym znajdzie się nasza klawiatura. W tym przykładzie jest tylko jedna klawiatura, ale możesz dodać inne klawiatury i wymieniać je z niej
KeyboardView
.key_preview.xml
Podgląd klawisza to układ, który pojawia się po naciśnięciu klawisza na klawiaturze. Pokazuje tylko, jaki klawisz naciskasz (na wypadek, gdybyś zakrywał go dużymi, grubymi palcami). To nie jest wyskakujące okienko wielokrotnego wyboru. W tym celu sprawdź widok Kandydaci .
3. Dodaj pomocnicze pliki xml
Utwórz
xml
folder w swoimres
folderze. (Kliknij prawym przyciskiem myszyres
i wybierz Nowy> Katalog ).Następnie dodaj do niego następujące dwa pliki xml. (Kliknij
xml
folder prawym przyciskiem myszy i wybierz Nowy> Plik zasobów XML) .number_pad.xml
Tutaj zaczyna się robić ciekawiej. To
Keyboard
definiuje układ z klawiszami .Oto kilka rzeczy, na które należy zwrócić uwagę:
keyWidth
: To jest domyślna szerokość każdego klawisza. Te20%p
środki, które każdy klawisz powinien trwać 20% szerokości p Arent. Można go jednak zastąpić pojedynczymi klawiszami, jak widać z klawiszami Delete i Enter w trzecim rzędzie.keyHeight
: Jest tutaj zakodowany na sztywno, ale możesz użyć czegoś takiego, jak@dimen/key_height
ustawić go dynamicznie dla różnych rozmiarów ekranu.Gap
: Pozioma i pionowa przerwa określa, ile wolnego miejsca między klawiszami. Nawet jeśli ustawisz to na,0px
nadal jest mała luka.codes
: Może to być kod Unicode lub niestandardowa wartość kodu, która określa, co się dzieje lub co jest wprowadzane po naciśnięciu klawisza. Sprawdź,keyOutputText
czy chcesz wprowadzić dłuższy ciąg Unicode.keyLabel
: To jest tekst wyświetlany na klawiszu.keyEdgeFlags
: Wskazuje, do której krawędzi ma być wyrównany wpust.isRepeatable
: Jeśli przytrzymasz wciśnięty klawisz, wejście będzie powtarzane.method.xml
Ten plik informuje system o dostępnych podtypach metod wejściowych. Załączam tutaj tylko minimalną wersję.
4. Dodaj kod Java do obsługi wprowadzania klucza
Utwórz nowy plik Java. Nazwijmy to
MyInputMethodService
. Ten plik łączy wszystko razem. Obsługuje dane wejściowe otrzymane z klawiatury i wysyła je do dowolnego widoku, który je otrzymuje (EditText
na przykład).Uwagi:
OnKeyboardActionListener
nasłuchuje dane z klawiatury. Wymaga również wszystkich tych pustych metod w tym przykładzie.InputConnection
jest to, co jest używane do wysyłania danych wejściowych do innego widoku, takiego jak plikEditText
.5. Zaktualizuj manifest
Umieszczam to na końcu zamiast na początku, ponieważ odnosi się do plików, które już dodaliśmy powyżej. Aby zarejestrować klawiaturę niestandardową jako klawiaturę systemową, musisz dodać
service
sekcję do pliku AndroidManifest.xml . Umieść to wapplication
sekcji poactivity
.Otóż to! Teraz powinieneś móc uruchomić swoją aplikację. Jednak niewiele zobaczysz, dopóki nie włączysz klawiatury w ustawieniach.
6. Włącz klawiaturę w Ustawieniach
Każdy użytkownik, który chce korzystać z Twojej klawiatury, będzie musiał ją włączyć w ustawieniach Androida. Aby uzyskać szczegółowe instrukcje, jak to zrobić, zobacz poniższy link:
Oto podsumowanie:
Teraz powinieneś być w stanie używać klawiatury w dowolnym miejscu, w którym możesz wpisać Androida.
Dalsze badanie
Powyższa klawiatura jest użyteczna, ale aby stworzyć klawiaturę, której inne osoby będą chciały używać, prawdopodobnie będziesz musiał dodać więcej funkcji. Przeczytaj poniższe linki, aby dowiedzieć się, jak to zrobić.
Dziać się
Nie podoba ci się, jak standard
KeyboardView
wygląda i zachowuje się? Ja na pewno nie. Wygląda na to, że nie był aktualizowany od czasu Androida 2.0. A co z tymi wszystkimi niestandardowymi klawiaturami w Sklepie Play? Nie wyglądają jak brzydka klawiatura powyżej.Dobra wiadomość jest taka, że możesz całkowicie dostosować wygląd i zachowanie własnej klawiatury. Będziesz musiał wykonać następujące czynności:
ViewGroup
. Możesz wypełnić goButton
s lub nawet stworzyć własne niestandardowe widoki kluczy, które są podklasąView
. Jeśli używasz widoków wyskakujących, zanotuj to .onKeyClicked(String text)
lubonBackspace()
.keyboard_view.xml
,key_preview.xml
lubnumber_pad.xml
opisane w kierunkach wyżej, gdyż są to wszystko do normyKeyboardView
. Zajmiesz się wszystkimi tymi aspektami interfejsu użytkownika w swoim niestandardowym widoku.MyInputMethodService
klasie zaimplementuj niestandardowy odbiornik klawiatury zdefiniowany w klasie klawiatury. Jest to miejsceKeyboardView.OnKeyboardActionListener
, które nie jest już potrzebne.MyInputMethodService
klasyonCreateInputView()
utwórz i zwróć instancję klawiatury niestandardowej. Nie zapomnij ustawić niestandardowego nasłuchiwania klawiatury nathis
.źródło
Klawiatura w aplikacji
Ta odpowiedź wyjaśnia, jak skonfigurować niestandardową klawiaturę do użytku wyłącznie w aplikacji. Jeśli chcesz stworzyć klawiaturę systemową, której można używać w dowolnej aplikacji, zobacz moją drugą odpowiedź .
Przykład będzie wyglądał następująco. Możesz go zmodyfikować dla dowolnego układu klawiatury.
1. Uruchom nowy projekt Android
Nazwałam swój projekt
InAppKeyboard
. Zadzwoń, jak chcesz.2. Dodaj pliki układu
Układ klawiatury
Dodaj plik układu do
res/layout
folderu. Zadzwoniłem do mniekeyboard
. Klawiatura będzie niestandardowym widokiem złożonym , który zostanie nadmuchany z tego pliku układu xml. Możesz użyć dowolnego układu do rozmieszczenia klawiszy, ale ja używamLinearLayout
. Zwróć uwagę namerge
tagi.res / layout / keyboard.xml
Układ zajęć
Dla celów demonstracyjnych nasza aktywność ma jeden,
EditText
a klawiatura jest na dole. Nazwałem niestandardowy widok klawiaturyMyKeyboard
. (Wkrótce dodamy ten kod, więc na razie zignoruj błąd). Zaletą umieszczenia całego kodu klawiatury w jednym widoku jest to, że ułatwia on ponowne użycie w innym działaniu lub aplikacji.res / layout / activity_main.xml
3. Dodaj plik Java Keyboard
Dodaj nowy plik Java. Zadzwoniłem do mnie
MyKeyboard
.Najważniejszą rzeczą, na którą należy tutaj zwrócić uwagę, jest to, że nie ma stałego połączenia z żadnym
EditText
lubActivity
. Ułatwia to podłączenie go do dowolnej aplikacji lub działania, które tego potrzebuje. Ten niestandardowy widok klawiatury używa również znakuInputConnection
, który naśladuje sposób, w jaki klawiatura systemowa komunikuje się z plikiemEditText
. W ten sposób unikamy twardych linków.MyKeyboard
jest widokiem złożonym, który rozszerza układ widoku, który zdefiniowaliśmy powyżej.MyKeyboard.java
4. Skieruj klawiaturę na EditText
W przypadku klawiatur systemowych system Android używa InputMethodManager, aby wskazać klawiaturę na fokus
EditText
. W tym przykładzie działanie zajmie jego miejsce, podając łącze zEditText
naszej klawiatury niestandardowej do.Ponieważ nie używamy klawiatury systemowej, musimy ją wyłączyć, aby nie pojawiała się po dotknięciu
EditText
. Po drugie, musimy pobrać goInputConnection
zEditText
i przekazać do naszej klawiatury.MainActivity.java
Jeśli Twoja aktywność ma wiele tekstów edycji, będziesz musiał napisać kod, aby przekazać odpowiednie teksty edycji
InputConnection
do klawiatury. (Możesz to zrobić, dodającOnFocusChangeListener
iOnClickListener
do EditTexts. Zobacz ten artykuł, aby omówić ten temat). Możesz także chcieć ukryć lub pokazać klawiaturę w odpowiednim momencie.Skończone
Otóż to. Powinieneś móc teraz uruchomić przykładową aplikację i wprowadzić lub usunąć tekst zgodnie z potrzebami. Następnym krokiem jest zmodyfikowanie wszystkiego, aby dopasować je do własnych potrzeb. Na przykład w niektórych moich klawiaturach użyłem TextViews zamiast przycisków, ponieważ łatwiej jest je dostosować.
Uwagi
TextView
raczej a,Button
jeśli chcesz, aby klucze wyglądały lepiej. Następnie po prostu ustaw tło, które można narysować, a po naciśnięciu zmieni stan wyglądu.View
a niestandardowe klawiatury są podklasamiViewGroup
. Klawiatura rozkłada wszystkie klawisze programowo. Klawisze wykorzystują interfejs do komunikacji z klawiaturą (podobnie jak fragmenty komunikują się z działaniem). Nie jest to konieczne, jeśli potrzebujesz tylko jednego układu klawiatury, ponieważ układ xml działa dobrze do tego. Ale jeśli chcesz zobaczyć przykład tego, nad czym pracowałem, sprawdź wszystkieKey*
iKeyboard*
zajęcia tutaj . Zauważ, że używam tam również widoku kontenera, którego funkcją jest włączanie i wyłączanie klawiatur.źródło
InputMethodManager#showInputMethodPicker()
. Jeśli jednak oryginalna klawiatura nie ma takiego klawisza, jedynym sposobem, w jaki użytkownicy mogą przełączyć się na klawiaturę, jest zrobienie tego ręcznie w ustawieniach systemu. Apple jest lepszy od Androida w tej dziedzinie, ponieważ Apple wymaga, aby wszystkie klawiatury miały klawisz przełączania klawiatury.EditText
s, będziesz musiał dodaćonFocusChangedListener
do nich znak, aby po uzyskaniu fokusu można było przypisaćInputConnection
od bieżącegoEditText
do niestandardowej klawiatury.Zastosowanie
KeyboardView
:teraz masz
kbd
co jest normalnym widokiem.Fajną rzeczą w tym jest to, że
R.xml.custom
odnosi się do/res/xml/custom.xml
, który definiuje w xml układ klawiatury. Więcej informacji na temat tego pliku można znaleźć tutaj: Keyboard , Keyboard.Row , Keyboard.Key .źródło
Oto przykładowy projekt dla miękkiej klawiatury.
https://developer.android.com/guide/topics/text/creating-input-method.html
Twoje powinny znajdować się w tych samych wierszach z innym układem.
Edycja: Jeśli potrzebujesz klawiatury tylko w swojej aplikacji, jest to bardzo proste! Utwórz układ liniowy z orientacją pionową i utwórz w nim 3 układy liniowe z orientacją poziomą. Następnie umieść przyciski z każdego wiersza w każdym z tych poziomych układów liniowych i przypisz do przycisków właściwość wagi. Użyj android: layout_weight = 1 dla wszystkich, aby były równomiernie rozmieszczone.
To rozwiąże. Jeśli nie otrzymałeś tego, czego się spodziewałeś, prześlij kod tutaj, a my jesteśmy tutaj, aby Ci pomóc!
źródło
Jeden z najlepiej udokumentowanych przykładów, jakie znalazłem.
http://www.fampennings.nl/maarten/android/09keyboard/index.htm
KeyboardView
dostarczany jest powiązany plik XML i kod źródłowy.źródło
Niedawno natknąłem się na ten post, gdy próbowałem zdecydować, jakiej metody użyć do stworzenia własnej niestandardowej klawiatury. Uznałem, że API systemu Android jest bardzo ograniczone, więc zdecydowałem się stworzyć własną klawiaturę w aplikacji. Wykorzystując odpowiedź Suragcha jako podstawę moich badań, przystąpiłem do zaprojektowania własnego komponentu klawiatury . Jest opublikowany na GitHub z licencją MIT. Miejmy nadzieję, że zaoszczędzi to komuś dużo czasu i bólu głowy.
Architektura jest dość elastyczna. Istnieje jeden widok główny (CustomKeyboardView), który można wstrzyknąć za pomocą dowolnego układu klawiatury i kontrolera.
Musisz tylko zadeklarować CustomKeyboardView w swoim pliku XML aktywności (możesz to również zrobić programowo):
Następnie zarejestruj w nim swój EditText i powiedz, jakiego typu klawiatury mają używać:
CustomKeyboardView obsługuje resztę!
Mam piłkę za pomocą klawiatury Number, NumberDecimal i QWERTY. Zapraszam do pobrania i tworzenia własnych układów i kontrolerów. To wygląda tak:
Nawet jeśli nie jest to architektura, na którą zdecydujesz się wybrać, miejmy nadzieję, że pomocne będzie zapoznanie się z kodem źródłowym działającej klawiatury w aplikacji.
Ponownie, oto link do projektu: Niestandardowa klawiatura w aplikacji
źródło
Cóż, Suragch udzielił jak dotąd najlepszej odpowiedzi, ale pominął pewne drobne rzeczy, które były ważne przy kompilacji aplikacji.
Mam nadzieję dać lepszą odpowiedź niż Suragch, poprawiając jego odpowiedź. Dodam wszystkie brakujące elementy, których nie umieścił.
Skompilowałem mój apk za pomocą aplikacji na Androida, APK Builder 1.1.0. Więc zacznijmy.
Aby zbudować aplikację na Androida, potrzebujemy kilku plików i folderów, które są uporządkowane w określonym formacie i odpowiednio pisane wielkimi literami.
res layout -> pliki xml przedstawiające wygląd aplikacji na telefonie. Podobnie jak HTML kształtuje wygląd strony internetowej w przeglądarce. Zezwalanie na odpowiednie dopasowanie aplikacji do ekranów.
wartości -> stałe dane, takie jak colors.xml, strings.xml, styles.xml. Te pliki muszą mieć poprawną pisownię.
do rysowania -> zdjęcia {jpeg, png, ...}; Nazwij je dowolnie.
mipmap -> więcej fotek. używany do ikony aplikacji?
xml -> więcej plików xml.
src -> działa jak JavaScript w html. Pliki układu zainicjują widok początkowy, a plik java będzie dynamicznie kontrolować elementy znaczników i zdarzenia wyzwalające. Zdarzenia można również aktywować bezpośrednio w pliku layout.xml, tak jak w html.
AndroidManifest.xml -> Ten plik rejestruje, o czym jest Twoja aplikacja. Nazwa aplikacji, typ programu, wymagane uprawnienia itp. To sprawia, że Android jest raczej bezpieczny. Programy dosłownie nie mogą zrobić tego, o co nie poprosiły w Manifeście.
Obecnie istnieją 4 typy programów na Androida: aktywność, usługa, dostawca treści i odbiorca transmisji. Nasza klawiatura będzie usługą umożliwiającą jej działanie w tle. Nie pojawi się na liście aplikacji do uruchomienia; ale można go odinstalować.
Skompilowanie aplikacji obejmuje Gradle i podpisywanie APK. Możesz go zbadać lub użyć aplikacji APK Builder dla Androida. To bardzo proste.
Teraz, gdy rozumiemy rozwój Androida, stwórzmy pliki i foldery.
Utwórz pliki i foldery, jak omówiłem powyżej. Mój katalog będzie wyglądał następująco:
Pamiętaj, że jeśli używasz ide, takiego jak Android Studio, może on zawierać plik projektu.
Odp .: NumPad / res / layout / key_preview.xml
B: NumPad / res / layout / keyboard_view.xml
C: NumPad / res / xml / method.xml
D: Numpad / res / xml / number_pad.xml
Oczywiście można to łatwo edytować według własnych upodobań. Możesz nawet użyć obrazów zamiast słów dla etykiety.
Suragch nie zademonstrował plików w folderze wartości i założył, że mamy dostęp do Android Studio; która automatycznie je tworzy. Dobrze, że mam APK Builder.
E: NumPad / res / values / colors.xml
F: NumPad / res / values / strings.xml
G: NumPad / res / values / styles.xml
H: Numpad / AndroidManifest.xml
To jest plik, który naprawdę czekał na rywalizację. Tutaj poczułem, że nigdy nie skompiluję swojego programu. szloch. szloch. Jeśli zaznaczysz odpowiedź Suracgha, zobaczysz, że pozostawia pierwszy zestaw pól pustych i dodaje znacznik aktywności w tym pliku. Jak powiedziałem, istnieją cztery rodzaje programów na Androida. Aktywność to zwykła aplikacja z ikoną programu uruchamiającego. Ten numpad nie jest zajęciem! Ponadto nie podejmował żadnych działań.
Moi przyjaciele nie dołączają tagu aktywności. Twój program się skompiluje, a przy próbie uruchomienia ulegnie awarii! Jeśli chodzi o xmlns: android i uses-sdk; Nie mogę ci tam pomóc. Po prostu wypróbuj moje ustawienia, jeśli działają.
Jak widać, istnieje tag serwisowy, który rejestruje go jako usługę. Również service.android:name musi być nazwą usługi rozszerzającej klasę publiczną w naszym pliku java. MUSI być odpowiednio wielką literą. Pakiet jest również nazwą pakietu, który zadeklarowaliśmy w pliku java.
I: NumPad / src / Saragch / num_pad / MyInputMethodService.java
Uwaga: myślę, że java jest alternatywą dla src.
To był kolejny problem, ale nie tak sporny jak plik manifestu. Ponieważ znam Javę na tyle dobrze, że wiem, co jest czym, a co nie. Ledwo znam xml i jak to się wiąże z programowaniem na Androida!
Problem polegał na tym, że niczego nie importował! To znaczy, dał nam „kompletny” plik, który używa nazw, których nie można było rozwiązać! InputMethodService, Keyboard, itp. To zła praktyka, panie Suragch. Dziękuję za pomoc, ale jak spodziewałeś się kompilacji kodu, jeśli nazwy nie mogą zostać rozwiązane?
Poniżej znajduje się poprawnie zredagowana wersja. Po prostu natknąłem się na kilka wskazówek, które doprowadziły mnie we właściwe miejsce, aby dowiedzieć się, co dokładnie zaimportować.
Skompiluj i podpisz swój projekt.
W tym miejscu nie mam pojęcia, jako początkujący programista Android. Chciałbym nauczyć się tego ręcznie, ponieważ uważam, że prawdziwi programiści mogą kompilować ręcznie.
Myślę, że gradle jest jednym z narzędzi do kompilowania i pakowania do apk. apk wygląda jak plik jar lub rar dla pliku zip. Istnieją zatem dwa rodzaje podpisów. klucz debugowania, który nie jest dozwolony w sklepie Play i klucz prywatny.
Pomóżmy panu Saragchowi. Dziękuję za obejrzenie mojego filmu. Polub, zasubskrybuj.
źródło
Miałem ten sam problem. Na początku użyłem układu tabeli, ale układ zmieniał się po naciśnięciu przycisku. Jednak ta strona okazała się bardzo przydatna. http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-creating-a-numeric-keypad-with-gridlayout/
źródło