我有一个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 上的“完成”操作可以关闭对话框,就像按下“确定”一样,因为只有一个小部件要编辑。
看起来处理 IME “完成”的最佳方法通常是setOnEditorActionListener
在TextView
. 但我没有任何TextView
变量,NumberPicker
也没有明显公开任何TextView
或类似的编辑器回调。(也许NumberPicker
包含一个TextView
我可以搜索使用的恒定 ID findViewById
?)
NumberPicker.setOnValueChangedListener
确实会在“完成”操作上触发,但在点击或轻弹数字列表时也会触发,这绝对不应该关闭对话框。
基于这个问题,我尝试检查setOnKeyListener
,但使用软键盘时该界面根本没有触发。并不完全令人惊讶,因为KeyEvent
文档表明它更多地用于硬件事件,并且在最近的 API 中,软键盘根本不会发送它们。
如何将 IME“完成”连接到对话框的“确定”操作?
编辑:从源代码的外观来看,NumberPicker
布局确实包含 a EditText
,但它的 idid/numberpicker_input
在 package 中com.android.internal
。使用它并不容易,显然是不鼓励的。但似乎可能只有破解方法来获得我想要的行为。