マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

自作エディタを目指して その2

まだ、わかってないことが多いが、前回ソフトウェアキーボードの表示ができた。しかし、表示したはいいが、Viewが非表示になっても、キーボードが表示されっぱなしになってしまった。何かイベントひろって、そこでキーボード非表示にすればいいんだろうか?まぁ、今回はそこではなく、確定文字列の表示をしてみた。InputConnectionのcommitTextに確定文字列が来るのは想像できたので、BaseInputConnectionを継承して、commitTextをオーバーライドした。あと、getEditableが何なのか気になったが、とりあえずSpannableStringBuilderを返すようにした。

package test.edit;

import android.content.Context;
import android.view.View;
import android.view.MotionEvent;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.InputMethodManager;
import android.graphics.Color;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.text.Editable;
import android.text.SpannableStringBuilder;

public class EditView extends View{
    private InputMethodManager manager;
    private String commit = "";
    
    public EditView(Context context){
        super(context);
        manager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);

        setFocusable(true);
        setFocusableInTouchMode(true);
        setBackgroundColor(Color.WHITE);
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event){
        requestFocus();
        manager.showSoftInput(this, InputMethodManager.RESULT_SHOWN);
        
        return true;
    }
    
    @Override
    public boolean onCheckIsTextEditor(){
        return true;
    }
    
    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs){
        return new TextInputConnection(this, false);
    }
    
    @Override
    protected void onDraw(Canvas canvas){
        Paint paint = new Paint();
        
        canvas.drawText(commit, 0, 16, paint);
    }
    
    public class TextInputConnection extends BaseInputConnection{
        public TextInputConnection(View targetView, boolean fullEditor){
            super(targetView, fullEditor);
        }
        
        @Override
        public boolean commitText(CharSequence text, int newCursorPosition){
            boolean ret = super.commitText(text, newCursorPosition);
            commit = text.toString();
            invalidate();
            
            return ret;
        }
        
        @Override
        public Editable getEditable(){
            return new SpannableStringBuilder();
        }
    }
}