android – 为NumberPicker捕获键盘’Done’

android – 为NumberPicker捕获键盘’Done’,第1张

概述我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消. package org.dyndns.schep.example;import android.os.Bundler;import android.view.View;import android.widget.NumberPicker;import android.app.Activity; 我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.
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上执行“完成” *** 作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.

看起来处理IME“Done”的最佳方法通常是在TextVIEw上使用setonEditorActionListener.但我没有任何TextVIEw变量,而且NumberPicker显然没有暴露任何TextVIEw或类似的编辑器回调. (也许NumberPicker包含一个带有常量ID的TextVIEw,我可以使用findVIEwByID进行搜索?)

NumberPicker.setonValueChangedListener确实在“完成” *** 作时被触发,但在点击或轻拂数字列表时也会触发,这绝对不应该忽略对话框.

基于this问题,我尝试检出setonKeyListener,但在使用软键盘时该界面根本没有触发.这并不奇怪,因为KeyEvent文档表明它对硬件事件的意义更大,而在最近的API中,软键盘根本不会发送它们.

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

编辑:从源的外观来看,NumberPicker布局确实包含EditText,但其ID是包com.androID.internal中的ID / numberpicker_input.使用它并不容易,显然不鼓励.但似乎只有黑客可以获得我想要的行为方式.

解决方法

How can I connect the IME “Done” to my dialog’s “OK” action?

问题是,如果您没有在TextVIEw小部件上设置一个侦听器,并且当前可以使用IME,则无法传递IME的事件.做你想做的事情的一种方法是将我们自己的逻辑挂钩到与IME一起工作的NumberPicker的孩子(就像你在问题的最后部分已经讨论过的那样).为了避免使用某些ID或其他布局技巧(可能有问题)来获取该窗口小部件,您可以使用贪婪的策略,将侦听器设置为NumberPicker中可以触发所需事件的任何窗口小部件(TextVIEw或任何子类) of 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;        }    };@OverrIDepublic 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中的一个)并插入你自己的Widget ID(这将使得获取对小部件的引用是一个简单的任务).这样现在更容易实现,但从长远来看维护起来不方便.

总结

以上是内存溢出为你收集整理的android – 为NumberPicker捕获键盘’Done’全部内容,希望文章能够帮你解决android – 为NumberPicker捕获键盘’Done’所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1139201.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存