在android中第二次使用onEditorActionListener不起作用

Posted

技术标签:

【中文标题】在android中第二次使用onEditorActionListener不起作用【英文标题】:Using onEditorActionListener doesn't work for the second time in android 【发布时间】:2021-11-13 20:33:03 【问题描述】:

我是 android 开发的新手,我想要实现的是:

当用户通过屏幕键盘(软输入法)点击完成按钮时,现有的默认editText应该变成checkBox并再次创建editText以便用户可以输入一些再次数据。

这些我应该能够通过创建一个按钮并按下它来做到这一点,但我不想要一个按钮,我想要屏幕上的键盘交互,例如 DONE 按钮。

首先,我使用 onKeyListener 进行了尝试,但它在软键盘(手机)上不起作用,而是在笔记本电脑键盘等硬件键盘上起作用。

然后我也可以通过屏幕键盘使用onEditerActionListener() 执行上述功能,但只有一次我可以执行此操作,然后,“完成”按钮从屏幕上消失键盘,ENTER 按钮取代了 DONE 按钮。

编辑每当我使用editText.setSingleLine() 关注editText 时,我总是会出现“完成”,但这次当我点击editorActionListener 时不起作用?

我不知道为什么完成按钮不像我第一次点击时那样工作

XML:

    <EditText
        android:id="@+id/defaultEditText"
        android:layout_
        android:layout_
        android:layout_marginStart="32dp"
        android:layout_marginTop="32dp"
        android:layout_marginEnd="32dp"
        android:inputType="text"
        android:textSize="20sp"
        android:imeOptions = "actionDone"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />

安卓代码:

    TextView.OnEditorActionListener doneButtonListener = ( new TextView.OnEditorActionListener() 
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 

        if (actionId == EditorInfo.IME_ACTION_DONE) 

            //CREATING A CHECKBOX
            CheckBox toDoCheckBox = new CheckBox(MainActivity.this);
            toDoCheckBox.setText(defaultEditText.getText().toString());
            toDoCheckBox.setTextSize(20);
            toDoCheckBox.setId(View.generateViewId());
            previousViewId = toDoCheckBox.getId();

            ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) defaultEditText.getLayoutParams();

            ConstraintLayout.LayoutParams newParams = new ConstraintLayout.LayoutParams(
                    ConstraintLayout.LayoutParams.WRAP_CONTENT,
                    ConstraintLayout.LayoutParams.WRAP_CONTENT
            );

            newParams.width = params.width;
            newParams.height = params.height;

            //Constraints
            newParams.startToStart = params.startToStart;
            newParams.endToEnd = params.endToEnd;
            newParams.topToTop = params.topToTop;
            newParams.topToBottom = params.topToBottom;

            //Margins
            newParams.leftMargin = params.leftMargin;
            newParams.topMargin = params.topMargin;
            newParams.rightMargin = params.rightMargin;

            constraintLayout.addView(toDoCheckBox, -1, newParams);
            defaultEditText.setVisibility(View.INVISIBLE);


            // CREATING A EDITTEXT
            EditText newEditText = new EditText(MainActivity.this);
            newEditText.setWidth(defaultEditText.getWidth());
            newEditText.setHeight(defaultEditText.getHeight());
            newEditText.setId(View.generateViewId());
            newEditText.setSingleLine();

            ConstraintLayout.LayoutParams editTextParams = new ConstraintLayout.LayoutParams(
                    ConstraintLayout.LayoutParams.WRAP_CONTENT,
                    ConstraintLayout.LayoutParams.WRAP_CONTENT
            );

            if (isFirst) 
                editTextParams.topToBottom = previousViewId;
                editTextParams.startToStart = previousViewId;
                isFirst = false;

             else 
                editTextParams.topToBottom = previousViewId;
                editTextParams.startToStart = previousViewId;

            

            defaultEditText = newEditText.findViewById(newEditText.getId());
            newEditText.setLayoutParams(editTextParams);
            constraintLayout.addView(newEditText);

            return true;
        
        return false;
    
);

    defaultEditText.setOnEditorActionListener(doneButtonListener);

输出:

我正在重新发布这个问题,因为我没有得到我的问题的答案

【问题讨论】:

您需要在 EditText 中设置 'android:imeOptions="actionDone"' 您需要设置 imeOptions 并专注于您的第二次编辑,在运行时创建 newEditText.setImeOptions(EditorInfo.IME_ACTION_DONE);是的,我试过了,结果是,屏幕键盘消失了 专注于第二次编辑是什么意思? 'editText.requestFocus()' ,请求焦点使键盘和光标在editText上 【参考方案1】:

您正在运行时创建新的编辑文本,您还需要为新的编辑文本初始化editor action lister。 更新后的代码如下所示

defaultEditText = findViewById(R.id.defaultEditText);
defaultEditText.setOnEditorActionListener(this);

编辑器操作

 @Override
    public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) 
        //CREATING A CHECKBOX
        CheckBox toDoCheckBox = new CheckBox(TestingAcitvity.this);
        toDoCheckBox.setText(defaultEditText.getText().toString());
        toDoCheckBox.setTextSize(20);
        toDoCheckBox.setId(View.generateViewId());
        previousViewId = toDoCheckBox.getId();

        ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) defaultEditText.getLayoutParams();

        ConstraintLayout.LayoutParams newParams = new ConstraintLayout.LayoutParams(
                ConstraintLayout.LayoutParams.WRAP_CONTENT,
                ConstraintLayout.LayoutParams.WRAP_CONTENT
        );

        newParams.width = params.width;
        newParams.height = params.height;

        //Constraints
        newParams.startToStart = params.startToStart;
        newParams.endToEnd = params.endToEnd;
        newParams.topToTop = params.topToTop;
        newParams.topToBottom = params.topToBottom;

        //Margins
        newParams.leftMargin = params.leftMargin;
        newParams.topMargin = params.topMargin;
        newParams.rightMargin = params.rightMargin;

        constraintLayout.addView(toDoCheckBox, -1, newParams);
        defaultEditText.setVisibility(View.INVISIBLE);


        // CREATING A EDITTEXT
        EditText newEditText = new EditText(TestingAcitvity.this);
        newEditText.setWidth(defaultEditText.getWidth());
        newEditText.setHeight(defaultEditText.getHeight());
        newEditText.setId(View.generateViewId());
        newEditText.setSingleLine();

        ConstraintLayout.LayoutParams editTextParams = new ConstraintLayout.LayoutParams(
                ConstraintLayout.LayoutParams.WRAP_CONTENT,
                ConstraintLayout.LayoutParams.WRAP_CONTENT
        );

        if (isFirst) 
            editTextParams.topToBottom = previousViewId;
            editTextParams.startToStart = previousViewId;
            isFirst = false;
         else 
            editTextParams.topToBottom = previousViewId;
            editTextParams.startToStart = previousViewId;
        

        newEditText.requestFocus(); // request focus to focus on edit text
        defaultEditText = newEditText.findViewById(newEditText.getId());
        newEditText.setLayoutParams(editTextParams);
        defaultEditText.setOnEditorActionListener(this); // set editor action listener
        constraintLayout.addView(newEditText);

        return true;
    

【讨论】:

我想不通,如何将editorActionListener设置为新创建的editText,所以我没有直接设置defaultEditText.setEditorActionListener(),而是尝试单独创建onEditorActionListener然后设置defaultEditText.setOnEditorActionListener,但是它没有用 在我的代码中可以清楚的看到,defaultEditText = newEditText.findViewById(newEditText.getId());我将 oldEditText 对象更改为新对象,这还不够吗?顺便说一句,你的建议完全符合我的要求 defaultEditText 现在包含新对象的值(新对象没有附加任何侦听器),这就是它不起作用的原因。【参考方案2】:

在您的 edittext xml 中添加以下属性:

 android:imeOptions="actionDone"

【讨论】:

对不起,我根据最近尝试的实现对程序进行了某些更改,android:imeOptions= "actionDone" 就是其中之一,我忘记提及了。

以上是关于在android中第二次使用onEditorActionListener不起作用的主要内容,如果未能解决你的问题,请参考以下文章

“允许本地通知”警报不会在 iOS 8 iphone App 中第二次出现

为啥在 C++ 中第二次调用析构函数未定义的行为?

如何检测文本文件中第二次出现空行?

仅当条件在 Reactjs 中第二次运行时才显示水平线

仅在发布配置中第二次执行后应用程序才会崩溃

地理编码方法未在 for 循环中第二次执行