2010-09-14 6 views
0

J'ai une mise en page qui contient un TextView. Le contenu du TextView peut changer à l'exécution. (discuté sur un autre problème ici: Layout with dynamic position) Je peux positionner la mise en page par glisser & déposer. Si la taille de la mise en page ne change pas, la position reste, mais dès que la taille de la mise en page change (parce que plus de texte à l'intérieur du TextView) la position est réinitialisée. J'utilise le layout(left, top, right, bottom) pour positionner la mise en page.La mise en page doit rester à une position spécifique après le changement de contenu

Maintenant, je ne sais pas où je devrais ajouter mon layout() appel pour vous assurer qu'il reste à la bonne position ...

Voici ma classe

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); 
     } 
    } 
} 

Ma mise en page

<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> 

Répondre

1

Je l'ai eu de travail en étendant le AbsoluteLayout et setPadding() au lieu de layout(). Mon code:

@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 
} 
Questions connexes