我该如何拦截这类事件?
我需要添加一些逻辑,当用户试图粘贴一些文本到我EditText知道我可以使用TextWatcher但这个入口点对我不好,因为我只需要拦截粘贴的情况下,而不是每次用户按我的EditText,
我开发了一个简单的应用程序,如减法,添加.在这个应用程序中,我使用三个EditTexts,一个用于回答,另外两个用于提问.我想计算文本更改事件的问题答案.但是当我对这两个应用文本更改事件时,事件发生但不正常工作.因为当我在问题的第一个EditText中输入文本时事件发生但它抛出此异常:
07-03 16:39:48.844: E/EduApp Log :=>(12537): Error In Text change Event java.lang.NumberFormatException: unable to parse '' as integer
Run Code Online (Sandbox Code Playgroud)
我该怎么办?我使用TextWatcherfor text change事件.
txtOne.addTextChangedListener(this);
txtTwo.addTextChangedListener(this);
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
Run Code Online (Sandbox Code Playgroud) 我正在查看TextWatcher的源代码,我没有在这里得到这个概念.扩展到NoCopySpan有什么意义?
public interface TextWatcher extends NoCopySpan {
public void beforeTextChanged(CharSequence s, int start, int count, int after);
public void onTextChanged(CharSequence s, int start, int before, int count);
public void afterTextChanged(Editable s);
}
Run Code Online (Sandbox Code Playgroud)
package android.text;
/**
* This interface should be added to a span object that should not be copied into a new Spanned when performing a slice or copy operation on the original Spanned it was placed in.
*/
public interface NoCopySpan {
/**
* Convenience …Run Code Online (Sandbox Code Playgroud) 我有一个EditText.当我点击它时,它变得可聚焦.我将输入要输入EditText的输入文本.我想为EditText实现一个监听器,这样当我停止输入时,它应该自动将该文本保存到数据库中而不是一个按钮.如何让EditText的监听器听取是否停止输入?
我有一个处理程序是一个TextWatcher,我不知道如何获得View更改文本.
这是我的处理程序:
TextWatcher handler = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
oldText = s.toString();
}
@Override
public void afterTextChanged(Editable s) {
//v.setText("afterTextChanged");
}
};
Run Code Online (Sandbox Code Playgroud)
请注意注释部分,这是我想要的,View从EditText触发事件的那个开始,在文本更改后更改文本.
我如何.setText()在afterTextChanged事件中达到此方法?(就像查看的onClick事件一样v)
我正在开发一个Android应用程序,我有一个EditText,用户可以输入数字.我想使用不同的货币格式(比如##,##,###)来格式化数字,我想在运行中进行,即当用户输入每个数字时(而不是按下输入时).我google了一下,遇到了TextWatcher,我首先发现它很有希望,但结果却是一种绝对的痛苦.我正在HTC Desire手机上调试我的代码,它只有一个软键盘.
现在我想在用户按下数字(0到9),del(退格)键并输入密钥时收到回调.从我的测试中我发现了这些(至少在我的手机上)
1)当用户按del或输入键时,将调用editText onKeyListener.当用户按下回车键时,一次输入会调用onKey函数两次(我认为是ACTION_UP和ACTION_DOWN).当用户按下del时,onKey被调用一次(仅适用于ACTION_DOWN),我不知道为什么.用户按下任何数字(0到9)时都不会调用onKey,我也无法理解.
2)每当用户按任意数字(0到9)键时,都会调用TextWatchers 3个回调函数(beforeTextChanged,onTextChanged,afterTextChanged).所以我想通过一起使用TextWatcher和onKeyListener,我可以得到我需要的所有回调.
现在我的问题是这些......
1)首先在我的HTC软键盘上有一个键(带有向下箭头的键盘符号),当我点击它时键盘被重新签名而不给出任何回调.我仍然不能相信Android让用户编辑一个字段并辞职而不让程序处理(保存)编辑.现在我的editText显示一个值,我的对象有另一个值(我在输入时保存用户编辑,并通过使用对象中的值重置editText值来处理键盘按键,但我没有回答此键盘向下键) .
2)其次,我想在用户输入新数字后格式化数字.假设我在editText上已有123并且用户输入了按4,我希望我的editText显示1,234.我得到onTextChanged()和afterTextChanged()的完整数字,我可以格式化数字并将其放回到任何这些回调中的editText.我应该使用哪一个?哪种是最佳做法?
3)第三个是最关键的问题.当应用程序启动时,我将当前对象值放在editText中.假设我把123放在onResume()上,当用户输入一个数字(比如说4)时,我希望它是1234.但是在我的onTextChanged回调中我得到的是4123.当我再按一个键(比如5)我是得到45123.因此对于用户输入,editText光标指向文本的结尾.但是当手动设置值时,editText光标似乎不会更新.我相信我必须在textWatcher回调中做一些事情,但我不知道该怎么办.
我在下面发布我的代码.
public class AppHome extends AppBaseActivity {
private EditText ed = null;
private NumberFormat amountFormatter = null;
private boolean isUserInput = true;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.app_home_screen);
ed = (EditText)findViewById(R.id.main_amount_textfield);
amountFormatter = new DecimalFormat("##,##,###");
ed.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if(event.getAction() == KeyEvent.ACTION_DOWN)
return true;
String strippedAmount = ed.getText().toString().replace(",", "");
if(keyCode == KeyEvent.KEYCODE_DEL){
//delete pressed, strip …Run Code Online (Sandbox Code Playgroud) 我构建了一个Android应用程序.我有一个EditText.我想在用户更改文本后自动保存更改(或其他任何内容).现在我用
editText.addTextChangedListener(textWatcher);
Run Code Online (Sandbox Code Playgroud)
和
TextWatcher textWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {
...
}
Run Code Online (Sandbox Code Playgroud)
但是它会在每次微小的更改后保存更改(添加\删除一个字母),我希望它只在用户完成后才能保存(关闭键盘,点击不同的编辑文本等).我怎样才能做到这一点?
我正在尝试使用来自Google的libphonenumber的AsYouTypeFormatter和TextWatcher,我不确定它是否可行.我已经能够将文本格式化为从EditText字段输入并将其输出到另一个EditText但不能直接更改原始的EditText字段(这就是我想要的).我知道phoneNumberFormattingTextWatcher,但我们希望用户能够最终选择他们所在的区域设置,并且比使用允许的区域具有更多的控制权(从我收集的内容).
顶级:
private View phoneNumberView;
private EditText phoneNumberText;
private String formattedPhoneNumber;
private boolean isInAfterTextChanged;
private AsYouTypeFormatter aytf;
Run Code Online (Sandbox Code Playgroud)
首先,我在我的类顶部初始化AsYouTypeFormatter:
aytf = PhoneNumberUtil.getInstance().getAsYouTypeFormatter(Locale.getDefault().getCountry());
Run Code Online (Sandbox Code Playgroud)
在创建了我的标签之后,我创建一个EditText框,格式化其中的现有电话号码(可以工作),并附加监听器(这是当前的类):
phoneNumberView = inflater.inflate(R.layout.phone_number_setting, null);
phoneNumberText = (EditText) phoneNumberView.findViewById(R.id.dirty_phone_number);
phoneNumberText.setText(dirtyPhoneNumber);
for (int i = 0; i < dirtyPhoneNumber.length(); i++){
phoneNumberText.setText(aytf.inputDigit(dirtyPhoneNumber.charAt(i)));
}
aytf.clear();
phoneNumberText.setText(dirtyPhoneNumber);
phoneNumberText.addTextChangedListener(this);
Run Code Online (Sandbox Code Playgroud)
那么这就是我目前在TextWatcher函数中所拥有的,我不确定我的代码中应该包含哪些函数:
@Override
public void afterTextChanged(Editable s) {
if (!isInAfterTextChanged) {
isInAfterTextChanged = true;
if(s.length() > 0){
Log.v("AsYouTypeFormatter - source", s.toString());
for(int i = 0; i < s.length(); i++){
formattedPhoneNumber = aytf.inputDigit(s.charAt(i));
Log.v("AsYouTypeFormatter - formatted", formattedPhoneNumber); …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我将TextWatcher放在EditText上.当我更改EditText的文本时,TextWatcher的事件被调用两次.
我正在使用模拟器来运行应用程序.
我有一个TextWatcher,当所有EditTexts length()都是!= 0时启用一个按钮.我现在想要添加能力以确保数字是正数.我尝试在另一个if()中放入一个新的if()来检查是否> 0但是由于某种原因它不起作用.
所以我需要的是确保所有的EditText都不为空,并且输入了正数,然后启用该数字.
这就是我的意思,
public TextWatcher localWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
// When the text is edited, I want to check if all textViews are filled
@Override
public void afterTextChanged(Editable s) {
// Check if any of the TextViews are == 0, if so the button remains disabled
if (et1local.getText().toString().length() == 0 …Run Code Online (Sandbox Code Playgroud) android ×10
textwatcher ×10
java ×3
events ×1
formatter ×1
listener ×1
phone-number ×1
textview ×1