2010-03-01 55 views
55

我想要一个EditText,它在按下时创建DatePicker。所以我写了下面的代码:Android EditText onClickListener

mEditInit = (EditText) findViewById(R.id.date_init); 
    mEditInit.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      showDialog(DATEINIT_DIALOG); 
     } 

    }); 

但是,当我按下的EditText的动作是典型的:光标等待输入文字,而不是显示对话框我想要的。

任何想法?

感谢

+0

您应该使用一个微调,而不是一个EditText对话框。 – 2012-09-30 03:34:13

回答

14

这里是我实现

mPickDate.setOnKeyListener(new View.OnKeyListener() { 

    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     showDialog(DATE_DIALOG_ID); 
     return false; 
    } 
}); 

OR

mPickDate.setOnFocusChangeListener(new View.OnFocusChangeListener() { 

    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     showDialog(DATE_DIALOG_ID); 

    } 
}); 

见自己的不同的解决方案。 问题是因为(像RickNotFred所说)TextView通过DatePicker显示日期&编辑。 TextEdit不用于其主要目的。 如果您想让DatePicker重新弹出,您需要输入delete(第一种情况)或de focus(第二种情况)。

+1

,除非您添加一个onClickListener,我只是用onFocusChangeListener一起完成。这将工作:-) – neteinstein 2011-04-12 18:04:40

8

恕我直言,我RickNotFred的这一说法:

跳跳一个对话框时,一个EditText获得 焦点似乎是一个非标准 接口。

显示一个对话框,当使用按下一个EditText编辑日期是非常相似的默认,这是显示一个键盘一个数字键盘。使用EditText信号向用户显示日期可能会更改日期这一事实。将日期显示为不可编辑的TextView会向用户发出日期不可更改的信号。

106

当EditText获得焦点时,键盘似乎弹出。为了防止这种情况,可调焦设置为false:

<EditText 
    ... 
    android:focusable="false" 
    ... /> 

这种行为可以在不同厂商的Android操作系统的口味不尽相同,但在我测试过的 设备我发现这是足够的。如果键盘仍然弹出,使用提示而不是文本似乎有所帮助:

myEditText.setText("My text"); // instead of this... 
myEditText.setHint("My text"); // try this 

一旦你做到了这一点,你就点击收听应该工作根据需要:

myEditText.setOnClickListener(new OnClickListener() {...}); 
+0

这似乎工作,但是当你键入一个字段,然后单击键盘上的下一步,它会跳过焦点在false的字段。 – 2015-06-13 04:08:28

2

由于狄龙Kearns建议,将焦点设置为假可以正常工作。 但是,如果你的目标是取消键盘被点击的EditText时,您可能需要使用:完美的我

mEditText.setInputType(0); 
6

以下的作品。

首先设置您的日期选择器控件的输入为“无”,以防止软键盘从弹出:

<EditText android:inputType="none" ... ></EditText> 

然后添加这些事件侦听器,以显示包含日期选取器对话框:

// Date picker 
EditText dateEdit = (EditText) findViewById(R.id.date); 
dateOfBirthEdit.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_UP) { 
      showDialog(DIALOG_DATE_PICKER); 
     } 
     return false; 
    } 
}); 

dateEdit.setOnFocusChangeListener(new OnFocusChangeListener() { 

    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if (hasFocus) { 
      showDialog(DIALOG_DATE_PICKER); 
     } else { 
      dismissDialog(DIALOG_DATE_PICKER); 
     } 
    } 
}); 

最后一件事。为确保输入的日期,月份或年份从日期选择器正确复制,请在检索值之前调用datePicker.clearFocus(),例如通过getMonth()

+0

这很好,但有时我会得到重复的对话框。 – Maxrunner 2012-07-19 16:27:32

+0

简单修正:在每次showDialog之前都要关闭Dialog,这是可以肯定的。 – 2012-07-20 10:37:26

30

我有这个相同的问题。代码很好,但请确保将EditText的可聚焦值更改为false。

<EditText 
android:id="@+id/date" 
android:focusable="false"/> 

我希望这可以帮助任何有类似问题的人!

+0

这是一个非常好的一个简单的解决方案:) – Warpzit 2012-10-04 09:25:53

+0

不错的一个Yusuf,投票给你的一个; – 2013-07-26 12:20:51

+4

也不要设置启用=“false”,这将禁用onClickListener – OatsMantou 2014-05-22 02:07:10

3

这里是为我工作

设置编辑为false

<EditText android:id="@+id/dob" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:hint="Date of Birth" 
android:inputType="none" 
android:editable="false" 

/>

然后添加一个事件侦听器OnFocusChange

private View.OnFocusChangeListener onFocusChangeDOB= new View.OnFocusChangeListener() { 

@Override 
public void onFocusChange(View v, boolean hasFocus) { 
    if (hasFocus){ 
    showDialog(DATE_DIALOG_ID); 
    } 
} 
}; 
+3

谨防摩托罗拉手机运行Android 2.3.x.如果EditText位于可滚动区域的某个位置,则摩托罗拉将在滚动时自动移动焦点。这意味着你可以向下滚动,当EditText获得焦点时,弹出日期对话框,这是令人惊讶和不好的。 – 2012-09-08 17:43:59

37

通常情况下,你希望最大与EditText的正常行为兼容。

所以你应该不是使用android:focusable="false"因为,是的,该视图将不再是可以聚焦的,这看起来不好。例如,背景可绘制将不再显示其“已按下”状态。

你应该做的,而不是为以下:

myEditText.setInputType(InputType.TYPE_NULL); 
myEditText.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // showMyDialog(); 
    } 
}); 
myEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if (hasFocus) { 
      // showMyDialog(); 
     } 
    } 
}); 

通过将输入类型设置为TYPE_NULL,可以防止软键盘的弹出。

通过设置OnClickListenerOnFocusChangeListener,您确保当用户点击进入EditText领域的对话总是会打开,无论是在它获得焦点(第一次单击),并在随后的点击。

只是设置android:inputType="none"setInputType(InputType.TYPE_NULL)并不总是足够的。对于某些设备,您也应该在XML中设置android:editable="false",尽管它已被弃用。如果它不再工作,它将被忽略(因为所有不支持的XML属性)。

+3

完美的解决方案,应该是被接受的答案 – leoderprofi 2016-08-02 16:53:48

+0

当我这样做时,对话框会在关闭后重新打开,因为edittext会再次获得焦点。任何方式在这个? – AdamMc331 2016-11-28 18:00:02

+0

@ McAdam331您的布局中的EditText组件是唯一的小部件吗?你可以尝试添加'android:focusable =“true”'到你的父级布局吗? – caw 2016-11-29 21:27:42

5

好主题。那么,我已经这样做了。 在XML文件中:

<EditText 
    ... 
    android:editable="false" 
    android:inputType="none" /> 

在Java代码:

txtDay.setOnClickListener(onOnClickEvent); 
txtDay.setOnFocusChangeListener(onFocusChangeEvent); 

private View.OnClickListener onOnClickEvent = new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     dpDialog.show(); 
    } 
}; 
private View.OnFocusChangeListener onFocusChangeEvent = new View.OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if (hasFocus) 
      dpDialog.show(); 
    } 
}; 
1

为什么没有人提setOnTouchListener?使用setOnTouchListener很简单,只要返回true,如果侦听器已经消耗了事件,否则返回false。

1

这个工作对我来说:

mEditInit = (EditText) findViewById(R.id.date_init); 
mEditInit.setKeyListener(null); 
mEditInit.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if(hasFocus) 
      { 
       mEditInit.callOnClick(); 
      } 
     } 
    }); 
mEditInit.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     showDialog(DATEINIT_DIALOG); 
    } 

}); 
+1

它也适用于我!谢谢。 – 2017-07-06 18:35:32

6

EditText默认工作: 首先点击它的重点和第二次点击它处理onClickListener,所以你需要禁用焦点。然后在第一次点击onClickListener将处理。

为此,您需要将此android:focusableInTouchMode="false"属性添加到您的EditText。而已!

事情是这样的:

<EditText 
     android:id="@+id/editText" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:focusableInTouchMode="false" 
     android:inputType="text" />