2011-11-11 246 views
2

我做的按钮点击打开键盘和我存储在字符串中所有按键的价值,但我面对这样的按钮打开键盘点击

1. when i press CAPITAL keys then i will got 2 times char 
2. when i press search and Menu button then also enter the key 
3. some char i can't get like PIE 

一些问题,因此,请检查这个代码,并给我正确的答案。 我的代码是:

package com.indianic.phykeyboard; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.KeyCharacterMap; 
import android.view.KeyEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.inputmethod.InputMethodManager; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

public class KeyboardActivity extends Activity { 
    EditText mEdit; 
    Boolean key = false; 

    Button mKey, mMon; 
    String getvalue; 
    InputMethodManager imm; 
    StringBuilder stringBuilder; 
    TextView value; 
    String ch = ""; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mKey = (Button) findViewById(R.id.openkey); 

     value = (TextView) findViewById(R.id.value); 

     mKey.setOnClickListener(new OnClickListener() { 

      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
       imm.toggleSoftInput(0, 0); 
       stringBuilder = new StringBuilder(); 
      } 
     }); 

    } 

    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     switch (keyCode) { 
     case KeyEvent.KEYCODE_ENTER: 
      return true; 
     } 
     return false; 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     Log.v("log_tag", "char : " + event.getUnicodeChar()); 

     if (event.getUnicodeChar() != 0) { 
      int i = event.getUnicodeChar(); 
      ch = new Character((char) i).toString(); 
     } 

     if (ch.length() > 0) { 
      if (keyCode == KeyEvent.KEYCODE_DEL && stringBuilder.length() >= 1) { 
       stringBuilder.delete(stringBuilder.length() - 1, stringBuilder 
         .length()); 
      } else if (keyCode != KeyEvent.KEYCODE_DEL 
        && keyCode != KeyEvent.KEYCODE_ENTER) { 
       stringBuilder.append(ch); 
      } else if (keyCode == KeyEvent.KEYCODE_SEARCH 
        || keyCode == KeyEvent.KEYCODE_MENU) { 

      } 
     } 

     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      stringBuilder.delete(0, stringBuilder.length()); 
      finish(); 
     } 

     String str = stringBuilder.toString().trim(); 
     value.setText(str); 

     return false; 
    } 
} 
+0

为什么你不能使用[KeyboardView#onText()](http://developer.android.com/reference/android/inputmethodservice/KeyboardView.OnKeyboardActionListener .html#onText(java.lang.CharSequence))方法? – Bringer128

+0

@Bringer .......请你可以给我举个例子或演示这个.. –

回答

2

你可以试试这个代码:

public boolean onKeyDown(int keyCode, KeyEvent event) { 
     Log.v("log_tag", "char : " + event.getUnicodeChar()); 

     if (event.getUnicodeChar() != 0) { 
      int i = event.getUnicodeChar(); 
      ch += new Character((char) i).toString(); 
     } 
     if (keyCode == KeyEvent.KEYCODE_DEL && ch.length() > 0) { 
      ch = ch.substring(0, ch.length() - 1); 
     } 
     value.setText(ch); 
     return super.onKeyDown(keyCode, event); 
    } 
1
if (event.getUnicodeChar() != 0) { 
     int i = event.getUnicodeChar(); 
     ch = new Character((char) i).toString(); 
    } 

你的程序的一部分数据丢失。 A char不可能包含所有可用的Unicode码点。我不知道这是否与给你带来麻烦的东西有关,但这是一个迹象表明你没有正确地做事,试图修补你的错误可能是一个错误 - 解决这个问题需要进行更基本的重构至少你的事件处理程序。