Skocz do zawartości

Featured Replies

Napisano

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 ?

  • Odpowiedzi 4
  • Wyświetleń 2,4k
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Napisano

Twoja customowa klasa, której instancją jest edtWynik, nie implementuje metod wymaganych do reagowania na OnEditorAction?

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

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności