diordna čet 16.2.2017 20:52

Bok,

 

radim u android studiju jednu tipkovnicu i trebala bi mi mala pomoć. Dakle želim napraviti kada se dogodi neki događaj (recimo okine se neki senzor) da na neki način označim pojedini key. Pošto nemam baš iskustva s android programiranjem, ne znam kako bi trebao izgledati kostur aplikacije i kako bi klase trebale pravilno biti povezane.

 

tipkovnicu sam poceo raditi po ovom tutorijalu: https://code.tutsplus.com/tutorials/create-a-custom-keyboard-on-android--cms-22615

 

u mapi res/layout imam datoteku keyboard.xml koja je ista kao u tutorialu.

u mapi res/xml imam datoteku qwerty.xml u kojoj je napravljena tipkovnica (isto kao u tutorialu, samo sam izmijenio redoslijed i položaj slova). to je za sada ok.

 

zatim u mapi java u defaultnom package imam dvije klase:

CustomIME.java i MyKeyboardView.java

 

public class CustomIME extends InputMethodService
implements KeyboardView.OnKeyboardActionListener {

private MyKeyboardView kv;
private Keyboard keyboard;

private boolean caps = false;


@Override
public View onCreateInputView() {
kv = (MyKeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null);
keyboard = new Keyboard(this, R.xml.qwerty);
kv.setKeyboard(keyboard);
kv.setOnKeyboardActionListener(this);
return kv;


}
@Override
public void onKey(int primaryCode, int[] keyCodes) {
InputConnection ic = getCurrentInputConnection();
//playClick(primaryCode);
switch(primaryCode){
case Keyboard.KEYCODE_DELETE :
ic.deleteSurroundingText(1, 0);
break;
case Keyboard.KEYCODE_SHIFT:
caps = !caps;
keyboard.setShifted(caps);
kv.invalidateAllKeys();
break;
case Keyboard.KEYCODE_DONE:
ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
break;
default:
char code = (char)primaryCode;
if(Character.isLetter(code) && caps){
code = Character.toUpperCase(code);
}
ic.commitText(String.valueOf(code),1);
}
}

...
}

 

Za sada je implementirano OnKeyboardActionListener, ali to ću kasnije promijeniti da implementira senzore.

Prije je kao u tutorialu stajalo KeyboardView i sve je radilo. Nakon toga napravio sam novu klasu MyKeyboardView koja extenda KeyboardView i sada tipkovnica crasha.

 

public class MyKeyboardView extends KeyboardView {

int slovoCode=101;
public MyKeyboardView(Context context, AttributeSet attrs, int kod){
super(context, attrs);
slovoCode=kod;
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();

List<Keyboard.Key> keys = getKeyboard().getKeys();
for (Keyboard.Key key : keys) {
if (key.codes[0] == slovoCode) {
paint.setColor(Color.RED);
canvas.drawText(key.label.toString(), key.x + (key.width/2), key.y + (key.height/2), paint);

} else {
paint.setColor(Color.BLUE);
canvas.drawText(key.label.toString(), key.x + (key.width/2), key.y + (key.height/2), paint);

}
}
}
}

 

Za početak napravio bih da nekako pošaljem kod slova u ovaj objekt i onda da se pomoću funkcije onDraw samo to slovo na neki način označi (ovdje sam stavio da su sva slova plava, a jedno crveno). Ne mora biti cijeli button obojan, dovoljno mi je samo boja slova, odnosno bitno mi je da se vidi razlika između tog jednog slova i svih ostalih. Neki od linkova koji su mi pomogli u izradi:

http://stackoverflow.com/questions/6000543/customize-the-appearance-of-a-key

http://stackoverflow.com/questions/18224520/how-to-set-different-background-of-keys-for-android-custom-keyboard

http://stackoverflow.com/questions/17714172/how-to-change-key-background-of-any-key-in-android-soft-keyboard/22454382

 

Zatim sljedeći cilj mi je implementirati senzore i svaki put kad se senzor okine, da se označi neko drugo slovo.

 

Za sada, molio bih vas pomoć ako biste mi mogli objasniti kako da jedan key obojim/označim, odnosno kako da pošaljem taj kod slova unutra u onDraw i da se prikaz tipkovnice osvjezi s novom ofarbanom tipkom. Također pretpostavljam da sam još nešto zeznuo u klasi CustomIME u metodi onCreateInputView, pa bih vas molio da mi objasnite kako pravilno povezati te klase.