NumberPicker 捕获键盘“完成”

2023-12-24

我有一个AlertDialog只需一些文字,NumberPicker、确定和取消。

package org.dyndns.schep.example;
import android.os.Bundler;
import android.view.View;
import android.widget.NumberPicker;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;

public class FooFragment extends DialogFragment {
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mParent = (MainActivity) activity;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setPositiveButton(android.R.string.ok,
                new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                mParent.setFoo(foo());
            }
        })
        .setNegativeButton(android.R.string.cancel, null);

        View view = getActivity().getLayoutInflater.inflate(
                R.layout.dialog_foo, null);
        mPicker = (NumberPicker) view.findViewById(R.id.numberPicker1);
        mPicker.setValue(mParent.getFoo());
        builder.setView(view);
        return builder.create();
    }

    public int foo() {
        return mPicker.getValue();
    }

    private MainActivity mParent;
    private NumberPicker mPicker;
}

(我知道,该对话框尚未执行在暂停和恢复时保留状态所需的操作。)

我希望软键盘或其他输入法上的“完成”操作可以关闭对话框,就像按下“确定”一样,因为只有一个小部件需要编辑。

看起来处理 IME“完成”的最佳方法通常是setOnEditorActionListener on a TextView。但我没有任何TextView变量,以及NumberPicker没有明显暴露任何TextView,或类似的编辑器回调。 (或许NumberPicker包含一个TextView具有恒定的 IF 我可以搜索使用findViewById?)

NumberPicker.setOnValueChangedListener确实会在“完成”操作时触发,但在点击或轻拂数字列表时也会触发,这绝对不应该关闭对话框。

基于this https://stackoverflow.com/questions/3031887/how-to-catch-a-done-key-press-from-the-soft-keyboard问题,我尝试查看setOnKeyListener,但是使用软键盘时该界面根本没有触发。这并不完全令人意外,因为KeyEvent http://developer.android.com/reference/android/view/KeyEvent.html文档表明它更多地针对硬件事件,并且在最近的 API 中,软键盘根本不会发送它们。

如何将 IME“完成”连接到对话框的“确定”操作?

编辑:从消息来源来看,NumberPicker布局确实包含一个EditText,但它的 id 是id/numberpicker_input包装内com.android.internal。使用它并不容易,而且显然是不鼓励的。但似乎只有黑客方法才能获得我想要的行为。


如何将 IME“完成”连接到对话框的“确定”操作?

问题是,如果没有在 IME 上设置侦听器,则无法传递 IME 事件。TextView当前可与 IME 配合使用的小部件。做你想做的事情的一种方法是将我们自己的逻辑与NumberPicker的孩子与 IME 一起使用(就像您在问题的最后部分已经谈到的那样)。为了避免使用某些 id 或其他布局技巧(这可能会出现问题)来获取该小部件,您可以使用贪婪策略,将侦听器设置为来自NumberPicker这可以触发所需的事件(TextViews或任何子类TextView)。像这样的事情:

    private AlertDialog mCurrentDialog;
    private List<TextView> mTargets = new ArrayList<TextView>();
    private OnEditorActionListener mListener = new OnEditorActionListener() {

        @Override
        public boolean onEditorAction(TextView v, int actionId,
                KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                // if a child of NumberPicker triggers the DONE editor event
                // get a reference to the positive button(which you use in your
                // code) and click it
               mCurrentDialog.getButton(Dialog.BUTTON_POSITIVE).performClick();
            }
            return false;
        }
    };

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
     // ...
     mPicker = (NumberPicker) view.findViewById(R.id.numberPicker1);
        mPicker.setValue(mParent.getFoo());
        // clear any previous targets
        mTargets.clear();
        // find possible targets in the NumberPicker 
        findTextViews(mPicker);
        // setup those possible targets with our own logic 
        setupEditorListener();          
        builder.setView(view);
        // get a reference to the current showed dialog 
        mCurrentDialog = builder.create();          
        return mCurrentDialog;
    }

其中方法是:

private void findTextViews(ViewGroup parent) {
        final int count = parent.getChildCount();
        for (int i = 0; i < count; i++) {
            final View child = parent.getChildAt(i);
            if (child instanceof ViewGroup) {
                findTextViews((ViewGroup) child);
            } else if (child instanceof TextView) {
                mTargets.add((TextView) child);
            }
        }
    }

    private void setupEditorListener() {
        final int count = mTargets.size();
        for (int i = 0; i < count; i++) {
            final TextView target = mTargets.get(i);
            target.setOnEditorActionListener(mListener);
        }
    }

另一种可能(且合理)的解决方案(如 Naveen 在他的评论中已经提到的)是使用NumberPicker类(或修改 SDK 中的类)并插入您自己的小部件 ID(这将使获取小部件的引用成为一项简单的任务)。现在实施起来比较容易,但从长远来看维护起来不方便。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NumberPicker 捕获键盘“完成” 的相关文章

随机推荐

  • iOS 崩溃分析和报告 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 了解 javascript 全局命名空间和闭包

    我正在尝试提高对 javascript 中的全局命名空间的理解 我对以下几件事感到好奇 是否存在一个 GOD 即父 对象 所有对象 因为除了基元之外的所有事物都是对象 都要回答 如果是这样 该对象将是 窗口 吗 为什么在全局范围内使用变量
  • 选择取消按钮时如何重置 DatePicker

    我的应用程序中有一个 datePicker 对话框 当我选择日期时效果很好 但是 如果在对话框中更改日期然后按取消 原始编辑文本将保持不变 但日期选择器仍然具有取消之前的日期 我想确保每次进入日期选择器时 它都会设置 EditText 中的
  • 当键重复时如何使用 Java Stream API 添加 Map 的内部元素

    我有一个清单List
  • 如何从非活动类中检索上下文?

    我已经发现一个答案 https stackoverflow com questions 4177731 android how to call method from another class without passing contex
  • Symfony 2 调试工具栏未显示

    Symfony 调试工具栏不显示 我正在 app dev php 环境中运行该网站 config dev yml 文件包含以下行 web profiler toolbar true intercept redirects false app
  • 使用 jQuery 动态添加/删除输入字段

    我想使用 jquery 构建动态添加 删除表单 它应该看起来像 姓名类型需要吗 示例输入 姓名类型需要吗 托尼管理员选中 复选框 删除 我得到的是添加 删除输入框的示例 它如何转换为我的想法 我必须使用多列表吗 谢谢你的好心帮助 h1 jQ
  • 如何避免用户删除他的会话

    用例 目前 我正在尝试构建一个页面 用户可以在其中对内容进行投票 赞成 反对票 类似于StackExchange网络上的功能 但用户不需要自己注册即可对内容进行投票 所以这将是一种 匿名 投票页面 它是用 Laravel5 构建的 并使用
  • CModel 与 CFormModel 与 CActiveRecord

    我正在 yii 中构建一个数据库密集型应用程序 所以性能和安全性自然是一个值得关注的问题 除此之外 表单验证也是一个主要标准 为了安全起见 我计划对所有 Sql 查询使用参数绑定 对于验证 我想使用 Yii 提供的验证器 而不是推出我自己的
  • 如何为WCF服务库创建wsdl文件?

    我有一个 WCF 服务库项目 我正在尝试通过在 Visual Studio 中运行 WCF 测试客户端 按下 F5 来启动 WCF 测试客户端来生成 wsdl 文件 它启动了 WCF 测试客户端 但显示 无法添加服务 服务元数据可能无法访问
  • OpenCV:DetectMultiScale() 给出了太多的物体点

    我用以下方法训练了我的电脑opencv traincascade一整天使用 6000 多张类似于以下的正面图像来检测 2 欧元硬币 现在 我刚刚尝试运行一个简单的 OpenCV 程序来查看结果并检查文件cascade xml 最后的结果非常
  • 为什么我的

    这个问题在这里已经有答案了 我有一个正在尝试使用 Flexbox 创建的导航 我希望有一个最大高度 并且有 li 当没有足够的空间时推入新列 我已经显示了 ul 内联柔性 这 li 正在跳到一个新专栏 但是 ul 不随 li 造成溢出效果
  • 如何在禁用 StyleCop 代码分析的情况下创建 Visual Studio 构建配置?

    Question 我已经安装了StyleCop http stylecop codeplex com 现在源代码中到处都是 StyleCop 的波浪线 现在 我希望能够暂时启用和禁用 StyleCop 的分析 我本来期望有一个复选框显示 禁
  • 如何成功传递字符串数组作为参数alamofire

    我有一个接受字符串数组作为参数的端点 但我无法让它与 alamofire 一起使用 我用邮递员测试我的端点 它工作正常 即使在浏览器中也是如此 但是使用 alamofire 它会失败并且只返回整个内容 就好像我没有输入任何参数一样 func
  • Parallels Extensions“Extras”仍然有价值吗?

    The 任务 Parallels Extras 扩展 http blogs msdn com b pfxteam archive 2010 04 04 9990342 aspx于 2010 年发布 此后没有发布任何更新 我将此代码发布为 D
  • Rails中如何管理非自增主键?

    在使用 Rails 时 我有很多情况希望有一个非自动增量主键 示例 我在 A 和 B 之间有一对一的关系 B 描述了添加到 A 的一些特定功能 因此没有 A 就无法存在 所以我们有 A有一个BB 属于 A 自然的想法是将 B A id 作为
  • 在Linux中用Java代码执行FFmpeg命令的问题

    我执行此操作时遇到问题ffmpeg我的java代码中的命令 ffmpeg i sample mp4 i ad mp4 filter complex 0 v trim 0 15 setpts PTS STARTPTS v0 1 v trim
  • 如何使用jackson在java中解包和序列化java地图?

    我有一颗这样的豆子 class Foo private Map
  • vert.x 事件总线可以取代 Kafka 吗?

    我正在评估 vert x 框架 看看是否可以减少使用 Spring Boot 开发的微服务之间基于 Kafka 的通信 问题是 我可以更换吗 带有 vert x 事件总线的 Kafka 和 带有基于 vert x 的 verticle 的
  • NumberPicker 捕获键盘“完成”

    我有一个AlertDialog只需一些文字 NumberPicker 确定和取消 package org dyndns schep example import android os Bundler import android view