Макет должен оставаться на определенной позиции после изменения содержимого - PullRequest
0 голосов
/ 14 сентября 2010

У меня есть макет, который содержит TextView.Содержимое TextView может измениться во время выполнения.(здесь обсуждается другая проблема: Макет с динамическим положением ). Я могу расположить макет перетаскиванием.Если размер макета не изменяется, позиция остается, но как только размер макета изменяется (так как больше текста внутри TextView), позиция сбрасывается.Я использую layout(left, top, right, bottom) для размещения макета.

Теперь я не знаю, куда мне добавить мой вызов layout(), чтобы убедиться, что он остается в правильном положении ...

Вот мой класс

public class TextNoteOverlay extends FrameLayout implements OverlayView {

    private TextView mNoteText;
    private LinearLayout mLinearLayout;
    public static int mX = 0;
    public static int mY = 0;
    public static int mStartX = 0;
    public static int mStartY = 0;
    public boolean mShow;
    private Rect mNoteRect = new Rect();

    public TextNoteOverlay(Context context, AttributeSet attrs) {
        super(context, attrs);

        LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        li.inflate(R.layout.textnote, this);
        mNoteText = (TextView) findViewById(R.id.textnote_content);
        mLinearLayout = (LinearLayout) findViewById(R.id.textnote_layout);

        setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                mLinearLayout.getHitRect(mNoteRect);
                if (mNoteRect.contains((int) event.getX(), (int) event.getY())) {
                    if (event.getAction() == MotionEvent.ACTION_DOWN) {
                        mStartX = (int) event.getX() - mLinearLayout.getLeft();
                        mStartY = (int) event.getY() - mLinearLayout.getTop();
                        return true;
                    }
                    mX = (int) event.getX() - mStartX;
                    mY = (int) event.getY() - mStartY;
                    mLinearLayout.layout(mX, mY, mX + mLinearLayout.getWidth(), mY + mLinearLayout.getHeight());
                    return true;
                }
                return false;
            }
        });
    }

    @Override
    public void hide() {
        mShow = false;
        setVisibility(View.GONE);
    }

    @Override
    public boolean isVisible() {
        return mShow;
    }

    @Override
    public void setContent(Object content) {
        if (content != null && content instanceof Content) {
            Content noteContent = (Content) content;
            if (noteContent.getText() != null) {
                mNoteText.setText(noteContent.getText());
            } else {
                mNoteText.setText("");
            }
        }
        mNoteText.invalidate();
        mLinearLayout.invalidate();
    }

    @Override
    public void show() {
        if (mNoteText.getText().toString().length() > 0) {
            mShow = true;
            setVisibility(View.VISIBLE);
        }
    }
}

Мой макет

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@android:color/transparent">
    <LinearLayout android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/postit"
        android:id="@+id/textnote_layout">
        <TextView android:id="@+id/textnote_content"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:maxWidth="200dp"
            android:maxHeight="200dp"
            android:minWidth="100dp"
            android:minHeight="100dp"
            android:singleLine="false"
            android:layout_margin="5dp"
            android:textColor="#000000" />
    </LinearLayout>
</LinearLayout>

1 Ответ

1 голос
/ 14 сентября 2010

У меня все работает, расширяя AbsoluteLayout и setPadding() вместо layout(). Мой код:

@SuppressWarnings("deprecation")
public class TextNoteOverlay extends AbsoluteLayout implements OverlayView {

    private TextView mNoteText;
    private LinearLayout mLinearLayout;
    public static int mX = 0;
    public static int mY = 0;
    public static int mStartX = 0;
    public static int mStartY = 0;
    public boolean mShow;
    private Rect mNoteRect = new Rect();

    public TextNoteOverlay(Context context, AttributeSet attrs) {
        super(context, attrs);

        LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        li.inflate(R.layout.textnote, this);
        mNoteText = (TextView) findViewById(R.id.textnote_content);
        mLinearLayout = (LinearLayout) findViewById(R.id.textnote_layout);

        setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                mLinearLayout.getHitRect(mNoteRect);
                mNoteRect.left += mX;
                mNoteRect.top += mY;
                mNoteRect.right = mNoteRect.left + mLinearLayout.getWidth();
                mNoteRect.bottom = mNoteRect.top + mLinearLayout.getHeight();
                if (mNoteRect.contains((int) event.getX(), (int) event.getY())) {
                    if (event.getAction() == MotionEvent.ACTION_DOWN) {
                        mStartX = (int) event.getX() - mNoteRect.left;
                        mStartY = (int) event.getY() - mNoteRect.top;
                        return true;
                    }
                    mX = (int) event.getX() - mStartX;
                    mY = (int) event.getY() - mStartY;

                    setPadding(mX, mY, 0, 0);
                    return true;
                }
                setPadding(mX, mY, 0, 0);
                return false;
            }
        });
    }

    // snipped
}
...