3

OpenGL ES 2.0 アプリケーションのユーザー入力を取得したいのですが、2 つの問題があります。

  • 1) ソフトウェア キーボードをアプリの前面に表示するにはどうすればよいですか?
  • 2) どうすれば入力をキャッチできますか?

私はこれを使用しようとしました:

//OpenGL ES 2.0 view class
public class OGLES2View extends GLSurfaceView 
{
    private static final int OGLES_VERSION = 2;
    private static Handler softKeyboardHandler;
    private final static int SHOW_IME_KEYBOARD = 0;
    private final static int HIDE_IME_KEYBOARD = 1;
    private static EditText textEdit;
    private static  InputMethodManager imm;

    private void setSoftKeyboardHandler()
    {
        softKeyboardHandler = new Handler()
        {
            public void handleMessage(Message msg)
            {
                switch(msg.what)
                {
                    case SHOW_IME_KEYBOARD:
                        textEdit.requestFocus();
                        imm.showSoftInput(textEdit,inputMethodManager.SHOW_IMPLICIT);//Nothing happens
                        Log.i("GLVIEW","SHOW KEYBOARD");
                        break;

                    case HIDE_IME_KEYBOARD:
                        imm.hideSoftInput(textEdit, 0);
                        Log.i("GLVIEW","HIDE KEYBOARD");
                        break;

                    default:
                        break;
                }
            }
        };
    }

    public OGLES2View(Context context) 
    {
        super(context);
        textEdit = new EditText(context);
        setEGLContextClientVersion(OGLES_VERSION);
        setRenderer(new OGLES2Renderer());
        imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
        setSoftKeyboardHandler();
    }

    public static void showIMEKeyboard() 
    {
        softKeyboardHandler.sendEmptyMessage(SHOW_IME_KEYBOARD);
    }

    public static void hideIMEKeyboard()
    {
        softKeyboardHandler.sendEmptyMessage(HIDE_IME_KEYBOARD);
    }

    //In main activity class
    private GLSurfaceView ogles2SurfaceView = null;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        //...
        ogles2SurfaceView = new OGLES2View(this);
        setContentView(ogles2SurfaceView);
    }

Handler はメッセージを受け取りますが、ソフトウェア キーボードがありません。テキストをキャッチするために、いくつかのクラスを書きました:

public class TextInputWatcher implements TextWatcher

と:

textEdit.addTextChangedListener(/*TextInputWatcher instance*/);

TextEditまたは、入力されたテキストをバックまたはエンターキーでキャッチ するように a を拡張します。

PSタブレット - トランスを手に入れたので、ハードウェア キーボードが取り付けられています。ありとなしで試してみましたが、違いはありませんでした。おまけの質問 - ハードウェア キーボードがある場合、ソフトウェア キーボードがポップアップするのを防ぐことができますか? また、どのようにしてそこから入力を取得できますか?

4

2 に答える 2

5

キーボードを表示:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

キーボードを隠す:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
于 2012-05-03T13:56:24.180 に答える
1

2Dゲームを作りました。あなたは以前の私と同じ問題を抱えていると思います。これを試して:

class DrawingPanel extends SurfaceView implements SurfaceHolder.Callback {

private static DrawThread _thread;    

public DrawingPanel(Context context, AttributeSet attrs) {
    super(context, attrs);
    getHolder().addCallback(this);       
   _thread = new DrawThread(getHolder(), this);
}
....

レイアウト「ゲームビュー」:

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent" 
android:layout_height="fill_parent">
<!-- YOUR SURFACE -->
<com.yourcompany.DrawingPanel android:id="@+id/surfaceView" android:layout_width="fill_parent" 
android:layout_height="fill_parent"></com.yourcompany.DrawingPanel>

<!-- YOUR BUTTONS -->
<RelativeLayout android:id="@+id/controlPanel" android:layout_width="fill_parent" android:orientation="horizontal"
android:layout_height="fill_parent" >   
<RelativeLayout android:layout_width="50px" android:orientation="vertical"
    android:layout_height="fill_parent"  android:gravity="center_vertical" android:layout_alignParentLeft="true">
         <Button android:id="@+id/leftButton" android:layout_width="wrap_content" 

        android:layout_height="50px" android:background="@xml/button_left_state"/> 
        <Button android:id="@+id/upgradeButton" android:layout_width="wrap_content" 
        android:layout_below="@id/leftButton"
        android:layout_height="50px" android:background="@xml/button_upgrade_state"/> 
</RelativeLayout>
</RelativeLayout>           
 </FrameLayout>

次に、以下のようにゲーム アクティビティでコンテンツを設定する必要があります。

  @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);     
    setContentView(R.layout.gameview);
   ...

それがあなたを助けることを願っています。

于 2012-05-03T14:04:03.223 に答える