找到两个解决方案 - 请参阅选定的答案
当用户点击EditText的某个区域时,我想弹出一个对话框。我使用onClick来捕获点击。这部分工作:用户第一次点击EditText时,弹出软键盘而对话框不弹出。随后的点击会弹出键盘,然后是对话框(键盘会消失)。
我怀疑这与EditText的关注有关。
这是一段代码片段:
public class PrefixEditText extends EditText implements TextWatcher, OnClickListener
{
public PrefixEditText (Context context)
{
super (context);
setOnClickListener (this);
}
@Override
public void onClick(View v)
{
int selStart = getSelectionStart();
if (selStart < some_particular_pos)
bring_up_dialog();
}
}
重要提示:我不想完全禁用正常的EditText行为。我希望用户能够进行区域选择(用于复制和粘贴)。我可能仍然希望它获得焦点(因此当具有物理键盘的人使用该应用程序时,我不打破模型)。点击可以设置光标位置。因此,覆盖onTouch并阻止EditText中所有onTouch操作的解决方案对我来说无效。
更新我发现了一点。如果EditText正在获得焦点,则会调用onFocusChange而onClick不会。如果它已经有焦点,则onClick被调用而onFocusChange没有。
其次,可以通过调用
隐藏键盘setInputType (InputType.TYPE_NULL);
在onFocusChange中这样做 - 键盘永远不会出现。在onClick中这样做(假设键盘在点击之前被隐藏)显然为时已晚 - 键盘显示然后消失。
下一个尝试的想法是在onTouch期间隐藏键盘。但是,我害怕搞乱这些代码 - 似乎无论我想出什么都会对EditText的未来版本非常脆弱。
有没有这个?
答案 0 :(得分:3)
可能这可以工作
EditText e = new EditText(context);
e.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
// TODO Auto-generated method stub
if(hasFocus)
{
//dialogue popup
}
}
});
或者你可以使用e.hasFocus();
,然后使用e.setFocusable(false);
使其失焦
///////////////我的代码
e.setInputType(InputType.TYPE_NULL);
e.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
AlertDialog.Builder sa = new Builder(ctx);
sa.create().setOnDismissListener(new OnDismissListener() {
public void onDismiss(DialogInterface dialog) {
// TODO Auto-generated method stub
e.setInputType(InputType.TYPE_CLASS_TEXT);
}
});
sa.show();
}
});
答案 1 :(得分:2)
尝试通过onClick更改捕获点击到onTouch
this.editText.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
//dialogue popup
}
return false;
}
});
答案 2 :(得分:1)
尝试这个,如果它可以帮助你。第一次编辑文本将表现为普通的editttext,条件是你可以根据需要显示对话
EditText editText;
mTim_edittext.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if(!hasFocus){
//statement
if(condition){
AlertDialog diaBox = Utils.showErrorDialogBox( "Term in Months Cannot be 0", context);
diaBox.show();
}
}
}
});
答案 3 :(得分:1)
经过大量实验,这里有两个有效的解决方案!我在两台设备上测试了它们 - 运行4.2.1的Nexus 7,运行4.0.4的Kyocera C5170。我的偏好是解决方案2。
解决方案1
首先,诀窍是确定onTouch中的光标位置而不是onClick,然后EditText有机会完成它的工作 - 特别是在它弹出键盘之前。
另外一条评论:请务必在清单中为弹出窗口设置android:windowSoftInputMode =“stateHidden”,否则您将获得键盘以及弹出窗口。
以下是整个代码:
public class ClickText extends EditText implements OnTouchListener
{
public ClickText (Context context, AttributeSet attrs)
{
super (context, attrs);
setOnTouchListener (this);
}
@Override
public boolean onTouch (View v, MotionEvent event)
{
if (event.getActionMasked() == MotionEvent.ACTION_DOWN)
{
int line = getLayout().getLineForVertical ((int)event.getY());
int onTouchCursorPos = getLayout().getOffsetForHorizontal (line, event.getX());
if (onTouchCursorPos < 10) // or whatever condition
showPopup (this); // or whatever you want to do
}
return false;
}
private void showPopup (final EditText text)
{
Intent intent = new Intent (getContext(), Popup.class);
((Activity)getContext()).startActivity (intent);
}
}
解决方案2
这个实际上更简单,我认为更好 - 副作用更少。
这里,诀窍是让EditText完成所有点击处理,然后异步覆盖它。要点是:等待触摸“放手” - MotionEvent.ACTION_UP - 然后,不要立即执行您的操作,将Runnable发布到事件队列并在那里执行操作。
整个代码:
public class ClickText extends EditText implements OnTouchListener
{
public ClickText (Context context, AttributeSet attrs)
{
super (context, attrs);
setOnTouchListener (this);
}
@Override
public boolean onTouch (View v, MotionEvent event)
{
switch (event.getActionMasked())
{
case MotionEvent.ACTION_UP:
{
post (new Runnable ()
{
// Do this asynch so that EditText can finish setting the selectino.
@Override
public void run()
{
int selStart = getSelectionStart();
int selEnd = getSelectionEnd();
// If selStart is different than selEnd, user has highlighed an area of
// text; I chose to ignore the click when this happens.
if (selStart == selEnd)
if (selStart >= 0 && selStart < 10) // or whatever range you want
showPopup (this);
}
});
break;
}
}
return false;
}
private void showPopup (final EditText text)
{
Intent intent = new Intent (getContext(), Popup.class);
((Activity)getContext()).startActivity (intent);
}
}
答案 4 :(得分:0)
使用下面的代码段
confidence_table <- structure(list(Age = c(0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L,
0L, 1L), Condition = c("old", "old", "old", "old", "new", "new",
"new", "new", "lure", "lure", "lure", "lure"), Prop = c(0.73993056,
0.75590278, 0.15069444, 0.13090278, 0.06388889, 0.04965278, 0.05902778,
0.05416667, 0.23055556, 0.23645833, 0.13819444, 0.12013889)), .Names = c("Age",
"Condition", "Prop"), row.names = c(NA, -12L), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"), vars = "Age", drop = TRUE, indices = list(
c(0L, 2L, 4L, 6L, 8L, 10L), c(1L, 3L, 5L, 7L, 9L, 11L)), group_sizes = c(6L,
6L), biggest_group_size = 6L, labels = structure(list(Age = 0:1), row.names = c(NA,
-2L), class = "data.frame", vars = "Age", drop = TRUE, .Names = "Age"))