Skocz do zawartości

ANDROID: wykrycie wciśnięcia klawisza DONE / OK


Gwynbleid

Rekomendowane odpowiedzi

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 ?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 4
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

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

Odnośnik do komentarza
Udostępnij na innych stronach

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]

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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ę



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności