2017-10-11 30 views
0

Est-il possible de placer l'image sur la dernière ligne de la TextViewTextView d'image réglée sur la dernière ligne

J'utilise setCompoundDrawablesWithIntrinsicBounds. Certaines idées à ce sujet seront bonnes.

Je dois également gérer les clics sur mon image uniquement. Ce comportement est représenté par le code suivant:

textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.info, 0); 
       textView.setOnTouchListener(new View.OnTouchListener() { 
        @Override 
        public boolean onTouch(View v, MotionEvent event) { 
         if(event.getAction() == MotionEvent.ACTION_UP) { 
          if(event.getRawX() >= textView.getRight() - textView.getTotalPaddingRight()){ 

           listener.onAddressClicked(livingAreas); 

           return true; 
          } 
         } 
         return true; 
        } 
       }); 
+0

dernière ligne de tex t vue? Essentiellement, essayez-vous de placer l'image en bas de la vue du texte? – Lokesh

+0

@Lokesh J'ai déjà essayé d'utiliser 'RelativeLayout' avec TextView + ImageView mais sans succès. – ManOfWar

+0

Vous pouvez utiliser la propriété android: drawable dans TextView. – Lokesh

Répondre

2

Avec la vue Texte, vous pouvez définir un dessin sur une position déterminée.

Vous pouvez utiliser cet exemple xml:

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:drawableBottom="@drawable/image" 
    android:text="blablabla"/> 

Programmatically:

public void setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)

text_view.setCompoundDrawables(null, null, null, getDrawable(drawable_image_id)); 
+0

Comment définir cette position? – ManOfWar

+0

De l'API: public void setCompoundDrawables (Dessable à gauche, Dessable à dessiner, Dessable à droite, Dessable à fond) – fattidare

0

Utilisez SpannableString de sorte que vous pouvez inclure dans votre texte. Pour l'exemple de code, cochez this question and answer

0

Texte personnalisé Vue: -

CustomEditText public class étend android.support.v7.widget.AppCompatTextView

{

private Drawable drawableRight; 
private Drawable drawableLeft; 
private Drawable drawableTop; 
private Drawable drawableBottom; 

int actionX, actionY; 

private DrawableClickListener clickListener; 

public CustomEditText(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // this Contructure required when you are using this view in xml 
} 

public CustomEditText(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle);   
} 

protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

} 

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
} 

@Override 
public void setCompoundDrawables(Drawable left, Drawable top, 
     Drawable right, Drawable bottom) { 
    if (left != null) { 
     drawableLeft = left; 
    } 
    if (right != null) { 
     drawableRight = right; 
    } 
    if (top != null) { 
     drawableTop = top; 
    } 
    if (bottom != null) { 
     drawableBottom = bottom; 
    } 
    super.setCompoundDrawables(left, top, right, bottom); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    Rect bounds; 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     actionX = (int) event.getX(); 
     actionY = (int) event.getY(); 
     if (drawableBottom != null 
       && drawableBottom.getBounds().contains(actionX, actionY)) { 
      clickListener.onClick(DrawableClickListener.DrawablePosition.BOTTOM); 
      return super.onTouchEvent(event); 
     } 

     if (drawableTop != null 
       && drawableTop.getBounds().contains(actionX, actionY)) { 
      clickListener.onClick(DrawableClickListener.DrawablePosition.TOP); 
      return super.onTouchEvent(event); 
     } 

     // this works for left since container shares 0,0 origin with bounds 
     if (drawableLeft != null) { 
      bounds = null; 
      bounds = drawableLeft.getBounds(); 

      int x, y; 
      int extraTapArea = (int) (13 * getResources().getDisplayMetrics().density + 0.5); 

      x = actionX; 
      y = actionY; 

      if (!bounds.contains(actionX, actionY)) { 
       /** Gives the +20 area for tapping. */ 
       x = (int) (actionX - extraTapArea); 
       y = (int) (actionY - extraTapArea); 

       if (x <= 0) 
        x = actionX; 
       if (y <= 0) 
        y = actionY; 

       /** Creates square from the smallest value */ 
       if (x < y) { 
        y = x; 
       } 
      } 

      if (bounds.contains(x, y) && clickListener != null) { 
       clickListener 
         .onClick(DrawableClickListener.DrawablePosition.LEFT); 
       event.setAction(MotionEvent.ACTION_CANCEL); 
       return false; 

      } 
     } 

     if (drawableRight != null) { 

      bounds = null; 
      bounds = drawableRight.getBounds(); 

      int x, y; 
      int extraTapArea = 13; 

      /** 
      * IF USER CLICKS JUST OUT SIDE THE RECTANGLE OF THE DRAWABLE 
      * THAN ADD X AND SUBTRACT THE Y WITH SOME VALUE SO THAT AFTER 
      * CALCULATING X AND Y CO-ORDINATE LIES INTO THE DRAWBABLE 
      * BOUND. - this process help to increase the tappable area of 
      * the rectangle. 
      */ 
      x = (int) (actionX + extraTapArea); 
      y = (int) (actionY - extraTapArea); 

      /**Since this is right drawable subtract the value of x from the width 
      * of view. so that width - tappedarea will result in x co-ordinate in drawable bound. 
      */ 
      x = getWidth() - x; 

      /*x can be negative if user taps at x co-ordinate just near the width. 
      * e.g views width = 300 and user taps 290. Then as per previous calculation 
      * 290 + 13 = 303. So subtract X from getWidth() will result in negative value. 
      * So to avoid this add the value previous added when x goes negative. 
      */ 

      if(x <= 0){ 
       x += extraTapArea; 
      } 

      /* If result after calculating for extra tappable area is negative. 
      * assign the original value so that after subtracting 
      * extratapping area value doesn't go into negative value. 
      */ 

      if (y <= 0) 
       y = actionY;     

      /**If drawble bounds contains the x and y points then move ahead.*/ 
      if (bounds.contains(x, y) && clickListener != null) { 
       clickListener 
         .onClick(DrawableClickListener.DrawablePosition.RIGHT); 
       event.setAction(MotionEvent.ACTION_CANCEL); 
       return false; 
      } 
      return super.onTouchEvent(event); 
     }   

    } 
    return super.onTouchEvent(event); 
} 

@Override 
protected void finalize() throws Throwable { 
    drawableRight = null; 
    drawableBottom = null; 
    drawableLeft = null; 
    drawableTop = null; 
    super.finalize(); 
} 

public void setDrawableClickListener(DrawableClickListener listener) { 
    this.clickListener = listener; 
} 

}

Set Drawable: -

<utils.CustomTextView 
      android:id="@+id/tvMessage" 
      android:textColor="@color/black" 
      android:gravity="start" 
      android:drawableRight="@drawable/ic_send_black_24dp" 
      android:layout_marginRight="@dimen/dp_5" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

//You can also set your drawable using java code 

Set clickListener: -

tvTextView.setDrawableClickListener(target -> 
      { 

       //Your code 

      } 
    ); 
+0

Avec l'aide de Custom TextView vous pouvez gérer votre clic sur drawable. –