Gwynbleid Napisano 22 Listopad 2013 Napisano 22 Listopad 2013 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 ?
deshu Napisano 24 Listopad 2013 Napisano 24 Listopad 2013 Twoja customowa klasa, której instancją jest edtWynik, nie implementuje metod wymaganych do reagowania na OnEditorAction?
Gwynbleid Napisano 25 Listopad 2013 Autor Napisano 25 Listopad 2013 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 :)
Gwynbleid Napisano 26 Listopad 2013 Autor Napisano 26 Listopad 2013 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]
Gwynbleid Napisano 26 Listopad 2013 Autor Napisano 26 Listopad 2013 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.
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się