-1

這是我的自定義鍵盤類。在keybord我有一個關鍵明確,當我點擊清除鍵我的註冊editetext應該清除但editetx值已清除,當我調試但在UI編輯文本不更新顯示相同的舊值。編輯文本沒有得到清晰的CustomKeyboard後按清除按鈕

我檢查了TextWatcher監聽器,當我調試時,按下清除按鈕後,它們的值也沒有顯示,但仍然沒有更新文本。

/** 
* When an activity hosts a keyboardView, this class allows several EditText's 
* to register for it. 
* 
*/ 
class CustomKeyboard extends KeyboardView { 

/** A link to the KeyboardView that is used to render this CustomKeyboard. */ 
private KeyboardView mKeyboardView; 
/** A link to the activity that hosts the {@link #mKeyboardView}. */ 
private Activity mHostActivity; 

/** The key (code) handler. */ 
private OnKeyboardActionListener mOnKeyboardActionListener = new OnKeyboardActionListener() { 

    public final static int CodeDelete = -5; // Keyboard.KEYCODE_DELETE 
    public final static int CodeCancel = -3; // Keyboard.KEYCODE_CANCEL 
    public final static int CodePrev = 55000; 
    public final static int CodeAllLeft = 55001; 
    public final static int CodeLeft = 55002; 
    public final static int CodeRight = 55003; 
    public final static int CodeAllRight = 55004; 
    public final static int CodeNext = 55005; 
    public final static int CodeClear = 55006; 
    public final static int CodeDZero = 55007; 
    public final static int Coderefresh = 55008; 
    public final static int Codeswap = 55009; 
    public final static int emptyKey = 555555008; 

    @Override 
    public void onKey(int primaryCode, int[] keyCodes) { 
     // NOTE We can say '<Key android:codes="49,50" ... >' in the xml 
     // file; all codes come in keyCodes, the first in this list in 
     // primaryCode 
     // Get the EditText and its Editable 
     View focusCurrent = mHostActivity.getWindow().getCurrentFocus(); 
     if (focusCurrent == null 
       || focusCurrent.getClass() != EditText.class) 
      return; 
     EditText edittext = (EditText) focusCurrent; 
     Editable editable = edittext.getText(); 
     int start = edittext.getSelectionStart(); 

     // Apply the key to the edittext 
     if (primaryCode == CodeCancel) { 
      hideCustomKeyboard(); 
     } else if (primaryCode == CodeDelete) { 
      if (editable != null && start > 0) 
       editable.delete(start - 1, start); 
     } else if (primaryCode == CodeClear) { 
      if (editable != null){ 
       editable.clear(); 
      } 
     } else if (primaryCode == CodeLeft) { 
      if (start > 0) 
       edittext.setSelection(start - 1); 
     } else if (primaryCode == CodeRight) { 
      if (start < edittext.length()) 
       edittext.setSelection(start + 1); 
     } else if (primaryCode == CodeAllLeft) { 
      edittext.setSelection(0); 
     } else if (primaryCode == CodeAllRight) { 
      edittext.setSelection(edittext.length()); 
     } else if (primaryCode == CodePrev) { 
      View focusNew = edittext.focusSearch(View.FOCUS_BACKWARD); 
      if (focusNew != null) 
       focusNew.requestFocus(); 
     } else if (primaryCode == CodeNext) { 
      View focusNew = edittext.focusSearch(View.FOCUS_FORWARD); 
      if (focusNew != null) 
       focusNew.requestFocus(); 
     } else if (primaryCode == CodeDZero) { 
      if (editable != null && start > 0) 
       editable.insert(start, "00"); 
     } else if (primaryCode == Coderefresh) { 
      // if(editable!=null) editable.clear(); 
     }else if (primaryCode == emptyKey) { 
      // if(editable!=null) editable.clear(); 
     } 
     else if (primaryCode == Codeswap) { 
      // if(editable!=null) editable.clear(); 
     } else { // insert character 
      editable.insert(start, Character.toString((char) primaryCode)); 
     } 
     long eventTime = System.currentTimeMillis(); 
     KeyEvent event = new KeyEvent(eventTime, eventTime, 
       KeyEvent.ACTION_UP, primaryCode, 0, 0, 0, 0, 
       KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE); 

     mHostActivity.dispatchKeyEvent(event); 
    } 

    @Override 
    public void onPress(int arg0) { 
    } 

    @Override 
    public void onRelease(int primaryCode) { 
    } 

    @Override 
    public void onText(CharSequence text) { 
    } 

    @Override 
    public void swipeDown() { 
     Log.d(VIEW_LOG_TAG, "SwipeDown"); 
    } 

    @Override 
    public void swipeLeft() { 
    } 

    @Override 
    public void swipeRight() { 
    } 

    @Override 
    public void swipeUp() { 
    } 
}; 

/** 
* Create a custom keyboard, that uses the KeyboardView (with resource id 
* <var>viewid</var>) of the <var>host</var> activity, and load the keyboard 
* layout from xml file <var>layoutid</var> (see {@link Keyboard} for 
* description). Note that the <var>host</var> activity must have a 
* <var>KeyboardView</var> in its layout (typically aligned with the bottom 
* of the activity). Note that the keyboard layout xml file may include key 
* codes for navigation; see the constants in this class for their values. 
* Note that to enable EditText's to use this custom keyboard, call the 
* {@link #registerEditText(int)}. 
* 
* @param host 
*   The hosting activity. 
* @param viewid 
*   The id of the KeyboardView. 
* @param layoutid 
*   The id of the xml file containing the keyboard layout. 
*/ 
@SuppressLint("NewApi") 
public CustomKeyboard(Activity host, int viewid, int layoutid) { 
    super(host, null); 
    mHostActivity = host; 
    mKeyboardView = (KeyboardView) mHostActivity.findViewById(viewid); 
    mKeyboardView.setKeyboard(new Keyboard(mHostActivity, layoutid)); 
    mKeyboardView.setPreviewEnabled(false); // NOTE Do not show the preview 
              // balloons 
    mKeyboardView.setOnKeyboardActionListener(mOnKeyboardActionListener); 
    // Hide the standard keyboard initially 
    mHostActivity.getWindow().setSoftInputMode(
      WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
} 

/** Returns whether the CustomKeyboard is visible. */ 
public boolean isCustomKeyboardVisible() { 
    return mKeyboardView.getVisibility() == View.VISIBLE; 
} 

/** 
* Make the CustomKeyboard visible, and hide the system keyboard for view v. 
*/ 
public void showCustomKeyboard(View v) { 
    mKeyboardView.setVisibility(View.VISIBLE); 
    mKeyboardView.setEnabled(true); 
    if (v != null) 
     ((InputMethodManager) mHostActivity 
       .getSystemService(Activity.INPUT_METHOD_SERVICE)) 
       .hideSoftInputFromWindow(v.getWindowToken(), 0); 
} 

/** Make the CustomKeyboard invisible. */ 
public void hideCustomKeyboard() { 
    mKeyboardView.setVisibility(View.GONE); 
    mKeyboardView.setEnabled(false); 
} 

/** 
* Register <var>EditText<var> with resource id <var>resid</var> (on the 
* hosting activity) for using this custom keyboard. 
* 
* @param resid 
*   The resource id of the EditText that registers to the custom 
*   keyboard. 
*/ 
public void registerEditText(int resid) { 
    // Find the EditText 'resid' 
    EditText edittext = (EditText) mHostActivity.findViewById(resid); 
    // Make the custom keyboard appear 
    edittext.setOnFocusChangeListener(new OnFocusChangeListener() { 
     // NOTE By setting the on focus listener, we can show the custom 
     // keyboard when the edit box gets focus, but also hide it when the 
     // edit box loses focus 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (hasFocus) 
       showCustomKeyboard(v); 
      else 
       hideCustomKeyboard(); 
     } 
    }); 
    edittext.setOnClickListener(new OnClickListener() { 
     // NOTE By setting the on click listener, we can show the custom 
     // keyboard again, by tapping on an edit box that already had focus 
     // (but that had the keyboard hidden). 
     @Override 
     public void onClick(View v) { 
      showCustomKeyboard(v); 
     } 
    }); 
    // Disable standard keyboard hard way 
    // NOTE There is also an easy way: 
    // 'edittext.setInputType(InputType.TYPE_NULL)' (but you will not have a 
    // cursor, and no 'edittext.setCursorVisible(true)' doesn't work) 
    edittext.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      EditText edittext = (EditText) v; 
      int inType = edittext.getInputType(); // Backup the input type 
      edittext.setInputType(InputType.TYPE_NULL); // Disable standard 
                 // keyboard 
      edittext.onTouchEvent(event); // Call native handler 
      edittext.setInputType(inType); // Restore input type 
      return true; // Consume touch event 
     } 
    }); 
    // Disable spell check (hex strings look like words to Android) 
    edittext.setInputType(edittext.getInputType() 
      | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); 
    edittext.setLongClickable(false); 
    edittext.setImeOptions(EditorInfo.IME_ACTION_DONE); 
} 

} 

鍵盤時會出現我的動畫包含的EditText的觀點,所以我想可能是因爲動畫的我得到了這個問題。

這是我的動畫代碼

private void moveViewToScreenTop(View view) { 
    TranslateAnimation anim = new TranslateAnimation(0, 0, 0, 
      -(FontStyle.wheelViewTranslation)); 
    anim.setDuration(500); 
    anim.setFillAfter(true); 
    view.startAnimation(anim); 
} 

可以請任何一個可以幫助me.Thanks提前。

+0

在你的佈局XML你分配爲'EditText'一個id?如果是的話,你的活動中沒有引用任何佈局'EditText'。你的'EditText'應該被實例化爲'EditText edittext =(EditText)mHostActivity.findViewById(R.id.resid);'其中'resid'是id您的佈局xml中的「EditText」。 – 2014-09-10 19:11:58

+0

是的,我爲編輯文本分配了id,並且還爲CustomKeyboard註冊了相同的id。 – Mubarak 2014-09-10 19:42:50

回答

0

試試這個它不是最好的方式做,但應該解決的問題

else if (primaryCode == CodeClear) { 
     if (editable != null){ 
      editable.clear(); 
      edittext.setText(""); 
     } 
+0

我也試過這個,但沒有工作。 – Mubarak 2014-09-10 19:43:15