У меня есть макет, который содержит 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>