【问题标题】:Skipping disabled EditText's when pressing Next IME button on soft keyboard按下软键盘上的 Next IME 按钮时跳过禁用的 EditText
【发布时间】:2013-08-23 16:46:03
【问题描述】:

我有一个LinearLayout 和几个EditText,它们都是以编程方式创建的(不是使用 XML 布局),尤其是没有 ID。

当我输入EditText 之一时,下一个(相对于焦点)被禁用,然后我按下键盘上的下一个 IME 按钮,焦点前进到禁用的EditText ,但我无法在其中输入任何内容。

我期待的是专注于推进到下一个启用EditText。除了通过edittext.setEnabled(false) 禁用EditText 之外,我还尝试通过edittext.setFocusable(false)edittext.setFocusableInTouchMode(false) 禁用其可聚焦性,并设置TYPE_NULL 输入类型,但无济于事。

有什么提示吗?

谢谢 ;)

【问题讨论】:

标签: android android-edittext android-softkeyboard


【解决方案1】:

通过检查键盘如何从this blog post 找到下一个焦点并通过子类化EditText 来解决:

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;

public class MyEditText extends EditText {

    public MyEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyEditText(Context context) {
        super(context);
    }

    @Override
    public View focusSearch(int direction) {
        View v = super.focusSearch(direction);
        if (v != null) {
            if (v.isEnabled()) {
                return v;
            } else {
                // keep searching
                return v.focusSearch(direction);
            }
        }
        return v;
    }

}

更多细节:

ViewGroupfocusSearch() 实现使用FocusFinder,它调用addFocusables()ViewGroup 的实现测试可见性,而View 实现测试可聚焦性。没有测试启用状态,这就是为什么我在上面的MyEditText 中添加了这个测试。

【讨论】:

    【解决方案2】:

    我解决了将 focusable 属性设置为 false 的问题,而不仅仅是 enabled 属性:

    editText.setEnabled(false);
    editText.setFocusable(false);
    

    【讨论】:

    • 这很有趣,当我在布局 XML 中设置可聚焦属性时它对我不起作用,我必须在代码中这样做才能使其工作。 (我的自定义复合视图中的 ImageButton)
    【解决方案3】:

    EditText editText = (EditText) findViewById(R.id.search);
    editText.setOnEditorActionListener(new OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            boolean handled = false;
            if (actionId == EditorInfo.IME_ACTION_SEND) {
                sendMessage();
                handled = true;
            }
            return handled;
        }
    });
    

    这是从http://developer.android.com/training/keyboard-input/style.html#Action 抓取的。

    如果您知道如何关注下一个TextView,您可以将OnEditorActionListener 添加到每个TextView,如果它被禁用,则让它将焦点传递给下一个。

    【讨论】:

    • 找到下一个EditText是这里的重点。由于我的活动中的 EditText 是动态的(它们的数量和状态是在运行时决定的),我不想保留 EditText 的列表。键盘如何找到下一个EditText?也许查看它的源代码可能会有所帮助......
    猜你喜欢
    • 2011-02-03
    • 2017-01-13
    • 2014-06-21
    • 2015-01-20
    • 2013-02-25
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多