Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何仅在特定时间调用函数_Java_Android_Android Framelayout_Motionevent - Fatal编程技术网

Java 如何仅在特定时间调用函数

Java 如何仅在特定时间调用函数,java,android,android-framelayout,motionevent,Java,Android,Android Framelayout,Motionevent,我有一个EditText和一个FrameLayout。如果用户在FrameLayout中拖动,背景会根据(X,Y)坐标中的像素更改颜色(RGB),并使用从RGB值转换的十六进制值更新EditText 这是我的整个代码的粘贴库链接: 我遇到的问题是以下代码: if (s.length() == 6) { int color = Integer.parseInt(etHexVal.getText().toString(), 16); int r = (color >> 1

我有一个
EditText
和一个
FrameLayout
。如果用户在FrameLayout中拖动,背景会根据(X,Y)坐标中的像素更改颜色(RGB),并使用从RGB值转换的十六进制值更新EditText

这是我的整个代码的粘贴库链接:

我遇到的问题是以下代码:

if (s.length() == 6) {
    int color = Integer.parseInt(etHexVal.getText().toString(), 16);
    int r = (color >> 16) & 0xFF;
    int g = (color >> 8) & 0xFF;
    int b = (color >> 0) & 0xFF;
    getXY(r, g, b);
    hexToRGB();
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(etHexVal.getWindowToken(), 0);
}

我想调用函数
getXY(r,g,b)
仅当
EditText
的文本发生更改并且我没有在
FrameLayout
中拖动时,因为否则会使我的应用程序滞后如何修改现有代码?

您可以创建TextWatcher对象,并使用EditText.addTextChangedListener(TextWatcher watcher)将其添加到EditText对象中。这将导致EditText对象在文本更改时调用TextWatcher的方法。您可以从TextWatcher中实现的PostTextChanged方法调用getXY。这样,仅当EditText对象中的文本更改时才会调用它

资料来源:

使用变量锁定对getXY()的调用。

声明一个新变量

Boolean callGetXY = true;
在动作(u)向下时设置为false,在动作(u)向上时设置为true

View.OnTouchListener flTouch = new View.OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {
       // your current content of the method here
       // ...
       if (event.getAction() == MotionEvent.ACTION_DOWN) {
           callGetXY = false;
       }

       if (event.getAction() == MotionEvent.ACTION_UP) {
           callGetXY = true;
       }

    }
};
将第82行更改为:

if (callGetXY) {
    getXY()
}

所以你得到了多次相同值的调用?为什么不在代码中做一个检查来设置值,以确保没有将相同的值写入editText?ie:if(!newHexValue.equals(etHexVal.getText().toString())然后是setText。这将阻止您进行不必要的处理。只有当文本在内部发生更改时才应调用该函数,但FrameLayout MotionEvent也会调用TextWatcher函数。如果查看pastebin代码,您会更好地理解。我只包含了部分代码,但在包含完整代码的pastebin中,我使用的是TextWatchr、 唯一的问题是每次我在布局中移动时发生的文本更改都会调用getXY。因此,当我拖动函数时,它试图设置X,Y,这就是我的应用程序导致ANR的原因。我实际上是在试图阻止
getXY()
在FrameLayout中拖动时被调用。我只想在更改EditText值和不拖动时调用它。我实际上为每个…ACTION\u MOVE和ACTION\u DOWN添加了一个布尔值,
isDrag=true;
ACTION\u UP
isDrag=false;
并且在TextWatcher函数中添加了
Toast.makeText(getApplicationContext(),String.valueOf(isDrag),2000).show();if(isDrag==false){getXY(r,g,b);}
如果我不拖拽并且isDrag为false,它将触发。出于某种原因,isDrag等于true而不是false;当我正确理解你的问题时,我有相同的想法。不,这不起作用。出于某种原因,
callGetXY
为false;出于某种原因。如果你需要,我可以向你发送我的应用程序包:)刚刚注意到一个问题。当我放弃这个视图时,它将是真的,并导致它自己调用getXY:/该死……不工作。