0

EditTextユーザーがをタップしたときに画面の下部にキーボードを表示できるようにしようとしていますEditText。私はInputMethodServiceとSoftKeyboardの例を知っていますが、私のキーボードはこれだけで使用できるはずなので、そのように使用することはできませんEditText

さらに、コンテキストメニューがあるはずですが、それはこの質問の一部ではありません(私は思います)。

私はたくさんのコードフラグメントを読みましたが、多くの場合、それらにはもう利用できないメソッド(つまり、getViewInflate())が含まれているか、理解できない、またはコードに変換できないコンテキストで記述されています( Androidに関する初心者です)。

EditTextほとんどの場合、 :をタップすると、この例外で失敗します。

java.lang.IllegalArgumentException: width and height must be > 0

その後に、私のクラスを含まないスタックトレースが続きます。以下のコードでわかるように、すべてのサイズが設定されています。

以下に表示されているのは、コードの現在のステータスです(コードの一部を削除しましたが、それでも意味があることを願っています)。また、メインスレッドの内部にあるものを使用しようとしhandler.post()ましたが、代わりにコメント付きのものを使用しhandler.post()ます...

RelativeLayout以下にないのは、EditTextKeyboardViewを1つのレイアウトで使用する試みです-XML。「無効なタイプ0x12」などの別の例外があり、レイアウトの作成時に何かが発生しました。

それはうまくいかないか、私はそれを行う方法がわかりません。誰かが私にこれを案内してもらえますか?足りないものがあれば教えてください。

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
  <EditText
    android:id="@+id/field_input"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:inputType="textMultiLine|textImeMultiLine"
    android:typeface="monospace"
    android:gravity="top|left"
    android:maxLength="255"
    />
</LinearLayout>

Keyboard.xml:

<?xml version="1.0" encoding="utf-8"?>
<com.messenger.keyboard.LatinKeyboardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/keyboard"
    android:layout_alignParentBottom="true"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />

LatinKeyboardView.java:

import android.inputmethodservice.KeyboardView;

public class LatinKeyboardView extends KeyboardView {
    :
}

EditorActivity.java

import android.app.Activity;

public class EditorActivity extends Activity {
    private View keyboardLayout;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        final EditText inputField;

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        keyboardLayout = (View)getLayoutInflater().inflate(R.layout.keyboard, null, false);
        inputField = (EditText)findViewById(R.id.field_input);
        registerForContextMenu(inputField);

        inputField.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Handler handler = new Handler(Looper.getMainLooper());

                    handler.post(new Runnable() {
                            @Override
                            public void run() {
                                LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                                //PopupWindow pw = new PopupWindow(inflater.inflate(R.layout.input, null, false), 100, 100, true);
                                PopupWindow pw = new PopupWindow(keyboardLayout, 100, 100, true);

                                pw.showAtLocation(findViewById(R.id.field_input), Gravity.CENTER, 0, 0);
                            }
                        });

/*
                    if (keyboardLayout.getVisibility() == View.GONE) {
                        // Show Media Player
                        TranslateAnimation mAnimUp = 
                            new TranslateAnimation(
                                    Animation.RELATIVE_TO_SELF, 0,
                                    Animation.RELATIVE_TO_SELF, 0,
                                    Animation.RELATIVE_TO_SELF, -keyboardLayout.getHeight(),
                                    Animation.RELATIVE_TO_SELF, 0);

                        mAnimUp.setStartOffset(500);
                        mAnimUp.setDuration(500);

                        keyboardLayout.setVisibility(View.VISIBLE);
                        keyboardLayout.setAnimation(mAnimUp);
                    }
*/
                }
            });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        :
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        :
    }

    @Override
    public boolean onOptionsItemSelected(final MenuItem item) {
        :
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
        :
    }
}
4

2 に答える 2

3

何時間にもわたる「調査と試行」の結果、私はついに自分の間違いを理解しました。それは「sjngm」の間違いのようです。仮想キーボードをレンダリングするには、次のことを行う必要があります

  1. レイアウトxmlファイルを拡張するか、KeyboardView(他の場合と同じように)行で宣言することにより、ビューを宣言しますView
  2. そして、ここで忘れられていたのは、KeyboardViewを取得しfindViewById()て呼び出すことです。 keyboardViewInstance.setKeyboard(new Keyboard(...) );

それでおしまい。画面にkeyboardViewが表示されます!もちろん、独自のキーボードクラスを作成するか、キーボードキーを定義するxmlリソースファイルで既存のクラスを使用する必要があります(res/xml/keyboard.xml)

于 2012-01-13T23:13:45.017 に答える
0

私は現在、InputMethodServiceそれ自体なしでそれを機能させるのに十分なほど壊れていなかったと思うので、私のアプローチを再発明しています。つまり、サンプルを破棄し、最初からレイアウトを機能させるために(2つではなく1つのレイアウトになりました)、入力を適切に処理するためにサンプルからコードを追加しました。

さらに調査した結果、アプリ固有のソフトキーボードについて非常に役立つ質問が見つかりました。あなたが私の状況に遭遇した場合は、そこを見てください。

于 2010-11-03T07:18:27.367 に答える