Сенсорный слушатель и смена родителя

Прошу прощения за мой английский. У меня проблема. Я использую слушатели LongClick и TouchListener.

При длинном клике вид удаляется, а родительский вид вставляется в другой родитель. Тач перестает работать, потому что произошла смена родителя.

Как сохранить TouchListener для просмотра?

static boolean drag = false;
static View parent;
static OnLongClickListener olcl = new OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {

        if(!drag) {
            parent = (View) v.getParent();
            int[] loc = {0, 0};
            v.getLocationOnScreen(loc);
            ((ViewGroup) parent).removeView(v);
            Main.mainRelative.addView(v);

            RelativeLayout.LayoutParams par = (LayoutParams) v.getLayoutParams();
            par.leftMargin = loc[0];
            par.topMargin = loc[1];
            v.setLayoutParams(par);

            drag = true;
            return true;
        }
        return false;
    }
};

static OnTouchListener otl = new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        if(v.getParent() != null && v.getParent() == Main.mainRelative) {
            //!!!!!!!!!!!!!
            RelativeLayout.LayoutParams par = (LayoutParams) v.getLayoutParams();
            par.leftMargin = (int) (event.getRawX() - v.getWidth()/2);
            par.topMargin = (int) (event.getRawY() - v.getHeight()/1.2);
            v.setLayoutParams(par);

            for(int y = 0; y < Main.radioGroupLeftMain.getChildCount(); y++) {
                RadioButton rb = (RadioButton) ((ViewGroup) Main.radioGroupLeftMain.getChildAt(y)).getChildAt(0);
                if(checkHit((int)event.getRawX(), (int)event.getRawY(), rb)) {
                    rb.setChecked(true);
                } else {
                    rb.setChecked(false);
                }

                if(event.getAction() == MotionEvent.ACTION_UP) {


                    try { ((ViewGroup) v.getParent()).removeView(v); } catch(Exception e) {};
                    if(v.getVisibility() == View.VISIBLE) {
                        ((ViewGroup) parent).addView(v);
                    }
                    drag = false;
                }
            }   
        }



        return false;
    }
};

public static boolean checkHit(int x, int y, View v) {
    int[] loc = {0, 0};
    v.getLocationOnScreen(loc);
    Rect rv = new Rect(loc[0], loc[1], loc[0]+v.getWidth(), loc[1]+v.getHeight());


    return rv.contains(x, y);
}

person Evgeniy    schedule 15.11.2013    source источник


Ответы (1)


когда вы собираетесь добавить представление Main.mainRelative.addView(v);
перед этим создайте новое представление, инициализируйте его с этим представлением v, например View vv = v
затем снова установите прослушиватель касания vv.setOnTouchLIstener(ot1);
попробуйте это, должно сработать...

person Bhavana Vadodariya    schedule 15.11.2013
comment
Спасибо за ответ. Я пытался это сделать. Это не работает, потому что не работает ACTION_DOWN - person Evgeniy; 15.11.2013
comment
не работает значит ACTION_DOWN?? вы хотите прослушиватель кликов или сенсорный прослушиватель или оба? - person Bhavana Vadodariya; 15.11.2013
comment
Представление имеет onLongClickListener и onTouchListener. При первом нажатии срабатывает longClick, а TouchListener не работает. Если отпустить палец с экрана и повторно применить - сработает ACTION_DOWN View и начнёт двигать пальцем - person Evgeniy; 15.11.2013
comment
Извините, ACTION_DOWN работает. Но после longClick - TouchListener еще не запущен. - person Evgeniy; 15.11.2013
comment
хм ... вы можете сделать одну вещь ... Выполните свою работу в ACTION_UP, предположим, если произошел длинный щелчок, ваш ACTION_UP не будет работать, в этом случае вы можете обрабатывать функциональные возможности в длинном щелчке, вы также можете использовать одну переменную флага .... - person Bhavana Vadodariya; 18.11.2013
comment
Спасибо за ответ. Я решил свою проблему с помощью OnDragListener. Я привязал к родителю onDragListener View и детектирую все координаты движения. Ставлю +1 за вашу помощь. - person Evgeniy; 18.11.2013