2014-02-13 5 views
0

У меня есть один EditText и один FrameLayout. Я сделал это таким образом, что если пользователь перетаскивает в FrameLayout, фон меняет цвет (RGB) на основе пикселя из (X, Y) координат, а также обновляет EditText значением Hex, преобразованным из значений RGB.Как позвонить функции только определенное время

Вот ссылка Pastebin для всего моего кода: http://pastebin.com/7P3QSmb4

вопрос я имею со следующим кодом:

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, потому что в противном случае это заставит мое приложение отставать. Как изменить существующий код?

+0

Таким образом, вы получаете это называется много раз с тем же значением? Почему бы вам просто не сделать чек в своем коде, который устанавливает значение, чтобы убедиться, что вы не записываете одно и то же значение в editText? т.е.: if (! newHexValue.equals (etHexVal.getText(). toString()) then setText. Это остановит вас от ненужной обработки. – natez0r

+0

Функция должна вызываться только в том случае, если этот текст изменяется внутри, а FrameLayout MotionEvent также вызывает TextWatcher Если вы посмотрите на код pastebin, вы поймете лучше. – Si8

ответ

1

Используйте переменную замок зову getXY()

Объявите новую переменную

Boolean callGetXY = true; 

Установить его ложна на ACTION_DOWN и обратно истинна на ACTION_UP

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() 
} 
+1

Я действительно пытаюсь предотвратить вызов 'getXY()', если я перетаскиваю FrameLayout.Я хочу только называть его, если я изменяю значение EditText &&, не перетаскивая. – Si8

+0

Я фактически добавил логическое для каждого ... ACTION_MOVE и ACTION_DOWN, 'isDrag = true;' ACTION _UP 'isDrag = false;' и внутри функции TextWatcher я добавил 'Toast.makeText (getApplicationContext(), String.valueOf (isDrag), 2000).показать(); \t if (isDrag = false) { \t getXY (r, g, b); \t} ', который будет срабатывать, если я не перетаскиваю, а isDrag - false. По какой-то причине isDrag равно true, а не false; – Si8

+1

У меня была такая же идея, когда я правильно понял ваш вопрос. – ntv1000

1

Вы можете создать объект TextWatcher и добавить его в объект EditText, используя EditText.addTextChangedListener (наблюдатель TextWatcher). Это приведет к тому, что объект EditText вызовет методы TextWatcher, которые будут вызываться при изменении текста. Вы можете вызвать getXY из метода afterTextChanged, который вы реализуете в своем TextWatcher. Таким образом, он будет вызываться только тогда, когда текст в объекте EditText изменится.

источники:

+0

Я включил только частичный код, но в pastebin, который имеет полный код, я использую TextWatcher. Единственная проблема - getXY получает вызов каждый раз, когда изменяется текст, который происходит, когда я перемещаюсь по макету, поэтому пока im перетаскивает функцию, пытается установить X, Y, поэтому мое приложение вызывает ANR. – Si8

Смежные вопросы