Java EDITTEXT Android:需要控制光标位置(阻止或允许)

Java EDITTEXT Android:需要控制光标位置(阻止或允许),java,android,android-edittext,Java,Android,Android Edittext,我正在开发一个应用程序,我面临以下问题: 假设我有以下表达式:计算器应用程序中的5+9x6/6+SIN(8)+TAN(78): 因此,我试图实现的是,如果editText的当前光标正好位于N in TAN或N in SIN或s in COS之后,并且假设用户决定删除SIN或COS或TAN,我希望立即删除整个字符串(而不需要用户逐个删除3个字符中的每一个) 我已通过以下代码片段成功实现了这一点: int cursorPosition = editTxt.getSelectionStart();

我正在开发一个应用程序,我面临以下问题:

假设我有以下表达式:计算器应用程序中的5+9x6/6+SIN(8)+TAN(78):

因此,我试图实现的是,如果editText的当前光标正好位于N in TAN或N in SIN或s in COS之后,并且假设用户决定删除SIN或COS或TAN,我希望立即删除整个字符串(而不需要用户逐个删除3个字符中的每一个)

我已通过以下代码片段成功实现了这一点:

 int cursorPosition = editTxt.getSelectionStart();
                try {
                    if (editTxt.getText().toString().substring(cursorPosition - 4, cursorPosition).equals("SIN") ||      ///runs if TAN, COS, or SIN were detected during deletion
                            editTxt.getText().toString().substring(cursorPosition - 4, cursorPosition).equals("COS") ||
                            editTxt.getText().toString().substring(cursorPosition - 4, cursorPosition).equals("TAN")) {

                        Toast.makeText(getApplicationContext(), "here", Toast.LENGTH_SHORT).show();

                        editTxt.setText(editTxt.getText().delete(cursorPosition - 4, cursorPosition));
                        editTxt.setSelection(cursorPosition - 4);
                    }else{
                        ///here is the regular char delete process
                        editTxt.setText(editTxt.getText().delete(cursorPosition-1,cursorPosition));
                        editTxt.setSelection(cursorPosition-1);
                    }
                }catch (Exception e){
                    editTxt.setText(editTxt.getText().delete(cursorPosition-1,cursorPosition));
                    editTxt.setSelection(cursorPosition-1);
                }
但这里的问题是:如果用户决定从TAN中删除“T”,那么我需要找到一种方法,删除“AN”的其余部分,换句话说,如果用户试图删除其任何字符,我想删除整个字符串“TAN”,SIN和COS也是如此


附件是一个简短的GIF,显示了我试图实现的目标(取自Google Calculator)。(基本上,我想防止用户将光标放置在“TAN”、“COS”和“SIN”之间的任意位置。

以下是我自己的简单解决方法:

if(selEnd != this.getText().length()){
            String nextCharacter=this.getText().toString().substring(selStart,selStart+1);
            try {
                switch (nextCharacter) {
                    case "A":
                    case "O":
                    case "I":
                        MainActivity.currentPosition = selEnd + 3;
                        this.setSelection(MainActivity.currentPosition);
                        break;
                    case "N":
                        MainActivity.currentPosition = selEnd + 2;
                        this.setSelection(MainActivity.currentPosition);
                        break;
                    case "S":
                        if (this.getText().toString().charAt(selStart + 1) != 'I') {
                            MainActivity.currentPosition = selEnd + 2;
                            this.setSelection(MainActivity.currentPosition);
                            break;
                        }
                }
            }catch(Exception e){
            }
        }

如果你想在开源软件中复制一个功能,为什么不看看源代码:@morrisonchange该repo中的表达式逻辑非常复杂,不受欢迎,对于像他这样的初学者来说可能完全没有用。我不确定这是否有任何帮助,也许他只是想学习?亲爱的,有了我包含的代码片段,它只能像我一样工作想要,除非SIN、COS或TAN字符串完好无损。但是如果用户删除了他们的任何字符,那么该代码将不起作用。我认为这对像你这样的专业人士来说是小菜一碟,@MorrisonChang,你能为我提供一种解决问题的方法吗?因为你似乎很有知识。你正在尝试删除c的两边的文本ursor。在任何单个字符上编辑都是EditText的属性。在不创建自己的自定义视图的情况下,基本上您需要跟踪用户从显示字符串中删除时每个函数名的开始和结束位置,并在用户每次键入内容时更新该数据结构。我猜Google Calc正在显示一个custom view不允许光标进入func name字符串,func是令牌而不是单个字符。如果不熟悉令牌,请从反向波兰符号计算器开始。谢谢各位,但我能够想出一个解决方案。我将把它作为我原始问题的答案发布。