EditText设置选择器位置不起作用

时间:2014-01-26 16:53:18

标签: android android-edittext selector

当我用EditText删除clrFunc()内的文字时,我丢失了光标(我看到它闪烁,但如果我输入则没有任何反应)。我无法重新输入。我必须回到EditText然后我才能输入。

/* WORKS PERFECT */
private void delFunc(){
    String str = display.getText().toString();
    if(str.length() > 0){
        String strStart = str.substring(0, SELECTOR_POSITION-1);
        String strEnd = str.substring(SELECTOR_POSITION);
        display.setText(strStart + strEnd);
        display.requestFocus();
        display.setSelection(--SELECTOR_POSITION); 
    }
}

/* NOT FULLY WORKING */
private void clrFunc(){
    display.setText("");    //text is set to ""
    display.requestFocus();    //not working
    display.setSelection(display.getText().length());    //not working
}

编辑:添加了更多代码,我正在构建简单的计算器。

private EditText display;
private Button b0, b1, b2, b3, b4, b5, b6, b7, b8, b9;
private Button bDec, bEquals, bAdd, bSub, bMultiply, bDivide, bClear, bBracket, bBackBracket, bDel, bClrH;
private Button bSin, bAsin, bCos, bAcos, bTan, bAtan, bLn, bLog, bPow, bPow2, bSqrt, bPi, bE, bToRad, bToDeg;
private TextView history;

private int SELECTOR_POSITION;


private void implementGUI(){        
    /* EditText */
    display = (EditText) findViewById(R.id.etDisplay);
    display.setOnTouchListener(this);
/* ... */
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch(v.getId()){
        case R.id.bZero:    insert("0"); break;
        case R.id.bOne:     insert("1"); break;
        case R.id.bTwo:     insert("2"); break;
        case R.id.bThree:   insert("3"); break;
        case R.id.bFour:    insert("4"); break;
        case R.id.bFive:    insert("5"); break;
        case R.id.bSix:     insert("6"); break;
        case R.id.bSeven:   insert("7"); break;
        case R.id.bEight:   insert("8"); break;
        case R.id.bNine:    insert("9"); break;

        case R.id.bDecPoint:    insert("."); break;
        case R.id.bAdd:         insert("+"); break;
        case R.id.bSub:         insert("-"); break;
        case R.id.bMultiply:    insert("*"); break;
        case R.id.bDivide:      insert("/"); break;

        case R.id.bBracket:         insert("("); break;
        case R.id.bBackBracket:     insert(")"); break;

        case R.id.bDel:     delFunc();      break;
        case R.id.bC:       clrFunc();      break;
        case R.id.bEquals:  calcFunc();     break;
        case R.id.bClrH:    clrHistory();   break;

        case R.id.bSin:     insert("sin(");         break;
        case R.id.bAsin:    insert("asin(");        break;
        case R.id.bCos:     insert("cos(");         break;
        case R.id.bAcos:    insert("acos(");        break;
        case R.id.bTan:     insert("tan(");         break;
        case R.id.bAtan:    insert("atan(");        break;
        case R.id.bLn:      insert("ln(");          break;
        case R.id.bLog:     insert("log(");         break;
        case R.id.bPow:     insert("^");            break;
        case R.id.bPow2:    insert("^2");           break;
        case R.id.bSqrt:    insert("sqrt(");        break;
        case R.id.bPi:      insert("(PI)");         break;
        case R.id.bE:       insert("(E)");          break;
        case R.id.bToRad:   insert("toRadians(");   break;
        case R.id.bToDeg:   insert("toDegrees(");   break;
    }
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    v.onTouchEvent(event);
    InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
    SELECTOR_POSITION = display.getSelectionStart();

    return true;
}

private void delFunc(){
    String str = display.getText().toString();
    if(str.length() > 0){
        String strStart = str.substring(0, SELECTOR_POSITION-1);
        String strEnd = str.substring(SELECTOR_POSITION);
        display.setText(strStart + strEnd);
        display.requestFocus();
        display.setSelection(--SELECTOR_POSITION); 
    }
}

/* NOT FULLY WORKING */
private void clrFunc(){
    display.setText("");
    display.requestFocus();
    display.setSelection(display.getText().length());
}

private void clrHistory(){
    history.setText("");
}

private void calcFunc(){
    try{
        MathEval math = new MathEval();
        String input = display.getText().toString();
        history.setText(String.format("%s = %s%n%s", input, math.evaluate(input), history.getText()));
    }catch(Exception e){
        e.printStackTrace();
        history.setText(String.format("%s%n%s", "ERROR", history.getText()));
    }
    clrFunc();
}

private void insert(String midStr){

    try{
        String input = display.getText().toString();

        String startStr = input.substring(0,SELECTOR_POSITION);
        String endStr = input.substring(SELECTOR_POSITION);
        String retStr = startStr + midStr + endStr;

        SELECTOR_POSITION += midStr.length();

        display.setText(retStr);
        display.setSelection(SELECTOR_POSITION);
    }catch(Exception e){
        e.printStackTrace();
    }

}

P.S。:对不起,我的语言不好。

1 个答案:

答案 0 :(得分:2)

如果您想直接输入EditText,那么您的方法中缺少以下内容:

display.requestFocus();

修改

这是我用来显示焦点键盘的方法,不同的焦点调用可以解决问题。

protected void showKeyboard(EditText edit) {
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(edit, 0);
    edit.requestFocusFromTouch();
}