Как надуть RelativeLayout в пользовательской ViewGroup - PullRequest
1 голос
/ 18 июня 2011

У меня есть пользовательская анимированная ViewGroup (в значительной степени основанная на SlidingTab ).

В моем приложении я сократил это до одного TextView, которое ведет себя так же, как SlidingTab (слайдер на экране блокировки). Это прекрасно работает, но TextView, который скользит, определен в коде. Я хотел бы иметь весь RelativeLayout, который вместо этого скользит.

Я просмотрел всевозможные посты , пробовал разные вещи , но все еще не заставил его работать. XML-файл RelativeLayout должен быть накачан и добавлен как дочерний элемент «parent» в конструкторе Slider, но я также должен уметь выполнять методы measure () и layout (). См. Соответствующий код ниже.

открытый класс SlindingView extends ViewGroup {

private static Slider mLeftSlider;
private static int tabWidth;

/**
 * Simple container class for all things pertinent to a slider.
 */
private static class Slider {

    private final TextView tab;

    Slider(ViewGroup parent) {
        // Want to change 'tab' to a RelativeLayout in xml
        tab = new TextView(parent.getContext());
        tab.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.FILL_PARENT));
        tab.setText("SLIDE THIS");

        parent.addView(tab);
    }

    void layout(int l, int t, int r, int b) {
        tabWidth = getTabWidth();
        int tabHeight = getTabHeight();
        tab.layout(0, 0, tabWidth, tabHeight);
    }

    public void measure() {
        tab.measure(View.MeasureSpec.makeMeasureSpec(0,
                View.MeasureSpec.UNSPECIFIED), View.MeasureSpec
                .makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
    }

    public int getTabWidth() {
        return tab.getMeasuredWidth();
    }

    public int getTabHeight() {
        return tab.getMeasuredHeight();
    }
}

/**
 * Constructor
 */
public SlindingView(Context context, AttributeSet attrs) {
    super(context, attrs);
    mLeftSlider = new Slider(this);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);

    mLeftSlider.measure();
    final int leftTabWidth = mLeftSlider.getTabWidth();
    final int leftTabHeight = mLeftSlider.getTabHeight();
    final int width = Math.max(widthSpecSize, leftTabWidth);
    final int height = leftTabHeight;

    setMeasuredDimension(width, height);
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    mLeftSlider.layout(l, t, r, b);
}

}

...