Napisano 22 Listopad 201311 l Witam, od 2 dni męczę się z głupia rzeczą. Mianowicie chodzi o obsługę Androidów. Tworzę prosta aplikację w której user ma wpisać w EditText odpowiednią liczbę np. 128. Po wciśnięciu OK / DONE na pojawiającej się klawiaturze chciałbym wykonać jakąś akcję typu "porównaj wpis z odpowiedzią" W jaki sposób mogę wykryć, że ktoś taki button wcisnął ? Przeglądam fora, pomoce itp. i nic nie działa. Wszędzie znajdję info: edtWynik.setOnEditorActionListener(new TextView.[color=#ff0000]OnEditorActionListener()[/color] { @Override public boolean onEditorAction(TextView v, int actionId, [color=#ff0000]KeyEvent[/color] event) { //verifies what key is pressed, in our case verifies if the DONE key is pressed if (actionId == EditorInfo.IME_ACTION_DONE) { //put your code here } return false; } }); Wszędzie wszyscy piszą że to działa... oczywiście, żeby było śmiesznie u mnie nie działa :/ Eclipse podkreśla mi zazanczone na czerwono fragmenty i pisze: "The type new TextView.OnEditorActionListener(){} must implement the inherited abstract method TextView.OnEditorActionListener.onEditorAction(TextView, int, KeyEvent)" Może ktoś z was ma pomysł o co chodzi ?
Napisano 24 Listopad 201311 l Twoja customowa klasa, której instancją jest edtWynik, nie implementuje metod wymaganych do reagowania na OnEditorAction?
Napisano 25 Listopad 201311 l Autor W sumie z jakiegoś posodu już wszystko działa. Nie wiem co się stało. Po poworcie do domu i odpaleniu eclipse wszystko było ok :/. Teraz mam inny problem. Mam takie pole EditText, do którego wpisuję wynik działania. Mam nawet własna klawiaturę z włąsnymi buttonami. Wszystko śmiga, tylko nie mam jak zaakceptowac wpisanego wyniku. Sam przycisk DONE akceptuje wpis i zamyka klawiaturę, a mi chodzi o to, aby po zaakceptowaniu wyniku był on sprawdzony, pole wyzerowane a apka ma czekać na kolejny wpis. Z tego co wyczytałem z sieci nie ma możliwości nadpisania standardowego klawisza DONE. Pytanie w jaki sposób mógłbym stworzyć np. OK i odczytać jego naciśnięcie ? Z tego co mi wiadomo samo pole EditText wyłapie tylko te klawisze, które powodują w nim jakąś akcję czyli: litery, cyfry, backspace... Próbowałem wychwycić wciśnięcie kropki, ale z jakiegos powdodu nie działa. może ktoś z was ma jakiś pomysł, jak to zrobić, aby po wpisaniu w pole tekstowe cyfry i wciśnięciu dowolnego klawisza cyfra była sprawdzona , pole wyzerowane... i żeby EditText nie tracił fokusa (nie chowała się klawiatura). 3 dzień już szukam i nic nie wychodzi :/ Jak będzie czas to jutro dokleje część testowanego kodu. Pozdr i dobranoc :)
Napisano 26 Listopad 201311 l Autor Kody: Własna klawiatura [color=#ff0000]Tu chciałem podpiąć jakiś klawisz pod "=" i wykryć jego kliknięcie... nie potrafię :([/color] [code] android:keyWidth="25%p" android:keyHeight="10%p"> [/code] Klasa obsługi klawiatury: [code] package com.gwynbleiddesign.mypackage; import android.app.Activity; import android.inputmethodservice.Keyboard; import android.inputmethodservice.KeyboardView; import android.inputmethodservice.KeyboardView.OnKeyboardActionListener; import android.text.Editable; import android.text.InputType; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnFocusChangeListener; import android.view.View.OnTouchListener; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.Toast; class CustomKeyboard extends Activity{ private KeyboardView mKeyboardView; private Activity mHostActivity; private OnKeyboardActionListener mOnKeyboardActionListener = new OnKeyboardActionListener() { public final static int CodeDelete = -5; // Keyboard.KEYCODE_DELETE public final static int CodeCancel = -3; // Keyboard.KEYCODE_CANCEL public final static int codeEquals = 16; public final static int CodePrev = 55000; public final static int CodeAllLeft = 55001; public final static int CodeLeft = 55002; public final static int CodeRight = 55003; public final static int CodeAllRight = 55004; public final static int CodeNext = 55005; public final static int CodeClear = 55006; @Override public void onKey(int primaryCode, int[] keyCodes) { // NOTE We can say '' in the xml file; all codes come in keyCodes, the first in this list in primaryCode // Get the EditText and its Editable View focusCurrent = mHostActivity.getWindow().getCurrentFocus(); if( focusCurrent==null || focusCurrent.getClass()!=EditText.class ) return; EditText edittext = (EditText) focusCurrent; Editable editable = edittext.getText(); int start = edittext.getSelectionStart(); // Apply the key to the edittext if( primaryCode==CodeCancel ) { hideCustomKeyboard(); } else if( primaryCode==CodeDelete ) { if( editable!=null && start>0 ) editable.delete(start - 1, start); } else if( primaryCode==CodeClear ) { if( editable!=null ) editable.clear(); } else if( primaryCode==CodeLeft ) { if( start>0 ) edittext.setSelection(start - 1); } else if( primaryCode==CodeRight ) { if (start } else if( primaryCode==CodeAllLeft ) { edittext.setSelection(0); } else if( primaryCode==CodeAllRight ) { edittext.setSelection(edittext.length()); } else if( primaryCode==CodePrev ) { View focusNew= edittext.focusSearch(View.FOCUS_BACKWARD); if( focusNew!=null ) focusNew.requestFocus(); } else if( primaryCode==CodeNext ) { View focusNew= edittext.focusSearch(View.FOCUS_FORWARD); if( focusNew!=null ) focusNew.requestFocus(); } else { // insert character editable.insert(start, Character.toString((char) primaryCode)); } } @Override public void onPress(int arg0) { } @Override public void onRelease(int primaryCode) { } @Override public void onText(CharSequence text) { } @Override public void swipeDown() { } @Override public void swipeLeft() { } @Override public void swipeRight() { } @Override public void swipeUp() { } }; public CustomKeyboard(Activity host, int viewid, int layoutid) { mHostActivity= host; mKeyboardView= (KeyboardView)mHostActivity.findViewById(viewid); mKeyboardView.setKeyboard(new Keyboard(mHostActivity, layoutid)); mKeyboardView.setPreviewEnabled(false); // NOTE Do not show the preview balloons mKeyboardView.setOnKeyboardActionListener(mOnKeyboardActionListener); // Hide the standard keyboard initially mHostActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); } /** Returns whether the CustomKeyboard is visible. */ public boolean isCustomKeyboardVisible() { return mKeyboardView.getVisibility() == View.VISIBLE; } /** Make the CustomKeyboard visible, and hide the system keyboard for view v. */ public void showCustomKeyboard( View v ) { mKeyboardView.setVisibility(View.VISIBLE); mKeyboardView.setEnabled(true); if( v!=null ) ((InputMethodManager)mHostActivity.getSystemService(Activity.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(v.getWindowToken(), 0); } /** Make the CustomKeyboard invisible. */ public void hideCustomKeyboard() { mKeyboardView.setVisibility(View.GONE); mKeyboardView.setEnabled(false); } public void registerEditText(int resid) { // Find the EditText 'resid' EditText edittext= (EditText)mHostActivity.findViewById(resid); // Make the custom keyboard appear edittext.setOnFocusChangeListener(new OnFocusChangeListener() { // NOTE By setting the on focus listener, we can show the custom keyboard when the edit box gets focus, but also hide it when the edit box loses focus @Override public void onFocusChange(View v, boolean hasFocus) { if( hasFocus ) showCustomKeyboard(v); else hideCustomKeyboard(); } }); edittext.setOnClickListener(new OnClickListener() { // NOTE By setting the on click listener, we can show the custom keyboard again, by tapping on an edit box that already had focus (but that had the keyboard hidden). @Override public void onClick(View v) { showCustomKeyboard(v); } }); // Disable standard keyboard hard way // NOTE There is also an easy way: 'edittext.setInputType(InputType.TYPE_NULL)' (but you will not have a cursor, and no 'edittext.setCursorVisible(true)' doesn't work ) edittext.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { EditText edittext = (EditText) v; int inType = edittext.getInputType(); // Backup the input type edittext.setInputType(InputType.TYPE_NULL); // Disable standard keyboard edittext.onTouchEvent(event); // Call native handler edittext.setInputType(inType); // Restore input type return true; // Consume touch event } }); // Disable spell check (hex strings look like words to Android) edittext.setInputType(edittext.getInputType() | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); } } // NOTE How can we change the background color of some keys (like the shift/ctrl/alt)? // NOTE What does android:keyEdgeFlags do/mean [/code] [color=#FF0000]Aktywność tu wychwytuję wciśnięcia klawiszy (apka łapie tylko to, co da się wpisać do pola tekstowego). Nie wiem jak wykryć / dodać jakiś klawisz typu ok, który zatwierdził by wpisaną w pole tekstowe odpowiedz, wyserowa je i czekał na kolejne wciśnięcie :/[/color] [code] import android.app.Activity; import android.view.KeyEvent; import android.view.Menu; import android.view.View; import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class Subtraction extends Activity { CustomKeyboard mCustomKeyboard; int obliczenia = 0, wpisanaWartosc = 0, wynik = 0, zadania = 0; TextView txtNumber1, txtNumber2, txtSign; EditText edtWynik; int firstRandom; int secondRandom; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_subtraction); /* mCustomKeyboard = new CustomKeyboard(this, R.id.keyboardview, R.xml.hexkbd ); mCustomKeyboard.registerEditText(R.id.txtWynik); */ txtNumber1 = (TextView) findViewById(R.id.txtNumber1); txtNumber2 = (TextView) findViewById(R.id.txtNumber2); txtSign = (TextView) findViewById(R.id.txtSign); edtWynik = (EditText) findViewById(R.id.txtWynik); edtWynik.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { Toast.makeText(getApplicationContext(), " actionId:" + actionId, Toast.LENGTH_SHORT).show(); //verifies what key is pressed, in our case verifies if the DONE key is pressed if (actionId == EditorInfo.IME_ACTION_DONE) { Toast.makeText(getApplicationContext(), "!!!!!!!!!!!!!!!!!!!!!!", Toast.LENGTH_SHORT).show(); obliczenia = firstRandom - secondRandom; wpisanaWartosc = Integer.parseInt(edtWynik.getText().toString()); if(wpisanaWartosc == (obliczenia)) { wynik++; zadania ++; Toast.makeText(getApplicationContext(), "DOBRZE", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "ŹLE", Toast.LENGTH_SHORT).show(); } edtWynik.setText(""); edtWynik.requestFocus(); } return false; } }); } /* @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.subtraction, menu); return true; } */ } [/code]
Napisano 26 Listopad 201311 l Autor Sorka za dubel, ale rozwiązanie okazało się banalne ;D Tworzymy nową klasę, przeznaczoną tylko do obsługi konkretnej akcji (u mnie dodawania liczb). Class dodawanie W tej klasie tworzę funkcje losowania liczb itp. W klasie CustomKeyboard tworzymy obiekt klasy dodawanie Dodawanie dodaj = new Dodawanie(); i za jego pomocą wywołujemy potrzebne nam funkcje, takie jak losowanie liczb :) chwilowo to rozwiązanie działa.
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto