Динамически перемещать вид в относительном макете - PullRequest
1 голос
/ 19 июля 2011

Я делаю индекс страницы, и текущая страница должна быть выделена изображением стрелки (viewview).

Индекс представляет собой RelativeLayout с 25 добавленными текстовыми представлениями:

for (int i = 0; i < 25; i++) {
        TextView tv = new TextView(this);
        tv.setText(Integer.toString(i+1));
        tv.setGravity(Gravity.CENTER);
        int id = 2000+i;
        tv.setId(id);
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT);
        if(i==0)
            params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
        else
            params.addRule(RelativeLayout.RIGHT_OF, prevViewId);
        prevViewId = id;
        rl.addView(tv,params);
    }

И когда страница меняется, я делаю что-то вроде этого:

        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        params.addRule(RelativeLayout.ALIGN_BOTTOM, 2000+i);
        params.addRule(RelativeLayout.ALIGN_RIGHT, 2000+i);
        params.addRule(RelativeLayout.ALIGN_LEFT, 2000+i);
        arrowImageView.setLayoutParams(params);
        rl.requestLayout();
        rl.invalidate();

Все выглядит правильно, я могу поместить стрелку на произвольной странице при «запуске», но стрелка не будет двигаться при изменении страницы.Я отладил и проверил, что код запущен и все выглядит правильно, но стрелка все еще застревает в первой позиции.Если я принудительно удалю и добавлю новый просмотр изображений вместо обновления LayoutParams, стрелка полностью исчезнет.

1 Ответ

1 голос
/ 09 апреля 2012

У меня такая же проблема .. я тоже хочу переместить свои взгляды вокруг во время выполнения внутри опорного макета.Так что, если кто-нибудь может помочь, это было бы здорово.

То, что я считаю, происходит выше, это то, что стрелка имеет свое местоположение, однако она не обновляется на экране.Поправьте меня, если я ошибаюсь, пожалуйста, это только мое предположение, так как у меня тоже такая же проблема.

-edit- После некоторой возни я обнаружил, что мне лучше сначала удалить, а потомдобавлять.rl.removeView (тв);rl.addView (tv, params);

-edit- также вы можете сохранить параметры для движущегося вида в уникальную переменную, чтобы все, что нужно сделать, это изменить поля ... например: вместо Params, у него будет свое собственное название «arrowParams», а затем переместить его уде просто необходимо: arrowParams.leftMargin = 2000 + я;и так далее ...

...