2017-08-24 3 views
1

Dans mon fichier XML, j'ai déjà ajouté les attributs suivants.Le curseur edittext Android n'a pas été vu malgré edittext.isCursorVisible() true

  <com.project.current.widget.AutoResizeEditText 
        android:id="@+id/edittext_add_text_new" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:focusable="true" 
        android:focusableInTouchMode="true" 
        android:hint="@string/text_sticker_hint" 
        android:inputType="textNoSuggestions|textVisiblePassword|textMultiLine" 
        android:isScrollContainer="false" 
        android:padding="@dimen/dimen_margin_small" 
        android:textColor="@color/black" 
        android:textColorHint="@color/blue_popover" 
        android:textSize="@dimen/text_font_edit_text_default" 
        android:layout_alignParentTop="true" 
        android:layout_centerHorizontal="true" 
        android:background="@drawable/bg_text_sticker" 
        android:layout_toRightOf="@+id/resize_icon_left" 
        android:cursorVisible="true" 
        android:textCursorDrawable="@null" 
        android:textIsSelectable="true" /> 

J'ai défini Focusable et FocusableOnTouch sur true. J'ai aussi cursorVisible défini sur true. Et juste pour s'assurer que le curseur ne prend pas la couleur blanche (l'arrière-plan est blanchâtre), j'ai mis le textCursorDrawable à '@null'

Mais le curseur n'est toujours pas visible dans la vue. J'ai un touchListener implémenté dans l'edittext (puisque j'ai aussi besoin de le déplacer autour de la mise en page parente). J'ai donc réglé le clavier sur ACTION_UP. À ce moment, je quand je vérifie

editTextViewNew.isCursorVisible() 

Il renvoie true. Mais le curseur n'est en réalité pas visible. Comment le rendre visible et le texte de mon edittext sélectionnable? (L'option de longue pression pour coller le texte copié ne fonctionne pas non plus.)

J'utilise le Custom AutoResizeEditText suivant pour redimensionner le texte dans editText selon mes besoins.

public class AutoResizeEditText extends android.support.v7.widget.AppCompatEditText { 
private static final int NO_LINE_LIMIT = -1; 
private final RectF _availableSpaceRect = new RectF(); 
private final SparseIntArray _textCachedSizes = new SparseIntArray(); 
private final SizeTester _sizeTester; 
private float _maxTextSize; 
private float _spacingMult = 1.0f; 
private float _spacingAdd = 0.0f; 
private float _minTextSize; 
private int _widthLimit; 
private int _maxLines; 
private boolean _enableSizeCache = true; 
private boolean _initiallized = false; 
private TextPaint paint; 

//set Boolean for disabling auto-resize when user is resizing using controls 
public static boolean isUserTyping = false; 

//disable autoresizing when user is not typing text 
public static void checkIfUserTyping(boolean isActive){ 
    isUserTyping = isActive; 
} 

private interface SizeTester { 
    /** 
    * AutoResizeEditText 
    * 
    * @param suggestedSize 
    *   Size of text to be tested 
    * @param availableSpace 
    *   available space in which text must fit 
    * @return an integer < 0 if after applying {@code suggestedSize} to 
    *   text, it takes less space than {@code availableSpace}, > 0 
    *   otherwise 
    */ 
    public int onTestSize(int suggestedSize, RectF availableSpace); 
} 

public AutoResizeEditText(final Context context) { 
    this(context, null, 0); 
} 

public AutoResizeEditText(final Context context, final AttributeSet attrs) { 
    this(context, attrs, 0); 
} 

public AutoResizeEditText(final Context context, final AttributeSet attrs, 
          final int defStyle) { 
    super(context, attrs, defStyle); 
    // using the minimal recommended font size 

    _minTextSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 
      12, getResources().getDisplayMetrics()); 
    _maxTextSize = getTextSize(); 
    if (_maxLines == 0) 
     // no value was assigned during construction 
     _maxLines = NO_LINE_LIMIT; 
    // prepare size tester: 
    _sizeTester = new SizeTester() { 
     final RectF textRect = new RectF(); 

     @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
     @Override 
     public int onTestSize(final int suggestedSize, 
           final RectF availableSPace) { 
      paint.setTextSize(suggestedSize); 
      final String text = getText().toString(); 
      final boolean singleline = getMaxLines() == 1; 
      if (singleline) { 
       textRect.bottom = paint.getFontSpacing(); 
       textRect.right = paint.measureText(text); 
      } else { 
       final StaticLayout layout = new StaticLayout(text, paint, 
         _widthLimit, Layout.Alignment.ALIGN_NORMAL, _spacingMult, 
         _spacingAdd, true); 
       // return early if we have more lines 
       Log.d("NLN", "Current Lines = " + Integer.toString(layout.getLineCount())); 
       Log.d("NLN", "Max Lines = " + Integer.toString(getMaxLines())); 
       if (getMaxLines() != NO_LINE_LIMIT 
         && layout.getLineCount() > getMaxLines()) 
        return 1; 
       textRect.bottom = layout.getHeight(); 
       int maxWidth = -1; 
       for (int i = 0; i < layout.getLineCount(); i++) 
        if (maxWidth < layout.getLineWidth(i)) 
         maxWidth = (int) layout.getLineWidth(i); 
       textRect.right = maxWidth; 
      } 
      textRect.offsetTo(0, 0); 
      if (availableSPace.contains(textRect)) 
       // may be too small, don't worry we will find the best match 
       return -1; 
      // else, too big 
      return 1; 
     } 
    }; 

    setEnabled(true); 
    setFocusableInTouchMode(true); 
    setFocusable(true); 
    setEnableSizeCache(false); 
    setMovementMethod(null); 
    _initiallized = true; 

} 

@Override 
public void setTypeface(final Typeface tf) { 
    if (paint == null) 
     paint = new TextPaint(getPaint()); 
    paint.setTypeface(tf); 
    super.setTypeface(tf); 
} 

@Override 
public void setTextSize(final float size) { 
    _maxTextSize = size; 
    _textCachedSizes.clear(); 
    adjustTextSize(); 
} 

@Override 
public void setMaxLines(final int maxlines) { 
    super.setMaxLines(maxlines); 
    _maxLines = maxlines; 
    reAdjust(); 
} 

@Override 
public int getMaxLines() { 
    return _maxLines; 
} 

@Override 
public void setSingleLine() { 
    super.setSingleLine(); 
    _maxLines = 1; 
    reAdjust(); 
} 

@Override 
public void setSingleLine(final boolean singleLine) { 
    super.setSingleLine(singleLine); 
    if (singleLine) 
     _maxLines = 1; 
    else 
     _maxLines = NO_LINE_LIMIT; 
    reAdjust(); 
} 

@Override 
public void setLines(final int lines) { 
    super.setLines(lines); 
    _maxLines = lines; 
    reAdjust(); 
} 

@Override 
public void setTextSize(final int unit, final float size) { 
    final Context c = getContext(); 
    Resources r; 
    if (c == null) 
     r = Resources.getSystem(); 
    else 
     r = c.getResources(); 
    _maxTextSize = TypedValue.applyDimension(unit, size, 
      r.getDisplayMetrics()); 
    _textCachedSizes.clear(); 
    adjustTextSize(); 
} 


@Override 
public void setLineSpacing(final float add, final float mult) { 
    super.setLineSpacing(add, mult); 
    _spacingMult = mult; 
    _spacingAdd = add; 
} 

/** 
* Set the lower text size limit and invalidate the view 
* 
* @param 

*/ 
public void setMinTextSize(final float minTextSize) { 
    _minTextSize = minTextSize; 
    reAdjust(); 
} 

private void reAdjust() { 
    adjustTextSize(); 
} 

private void adjustTextSize() { 
    if (!_initiallized) 
     return; 

    Log.d("IsUserTyping"," "+isUserTyping); 
    if(!isUserTyping) 
     return; 

    final int startSize = (int) _minTextSize; 
    /*final int heightLimit = getMeasuredHeight() 
      - getCompoundPaddingBottom() - getCompoundPaddingTop(); 
    _widthLimit = getMeasuredWidth() - getCompoundPaddingLeft() 
      - getCompoundPaddingRight();*/ 

    //User maxWidth and maxHeight the textBox can attain to calculate resize values 

    final int heightLimit = getMaxHeight() 
      - getCompoundPaddingBottom() - getCompoundPaddingTop(); 
    _widthLimit = getMaxWidth() - getCompoundPaddingLeft() 
      - getCompoundPaddingRight(); 

    if (_widthLimit <= 0) 
     return; 
    _availableSpaceRect.right = _widthLimit; 
    _availableSpaceRect.bottom = heightLimit; 
    super.setTextSize(
      TypedValue.COMPLEX_UNIT_PX, 
      efficientTextSizeSearch(startSize, (int) _maxTextSize, 
        _sizeTester, _availableSpaceRect)); 
} 

/** 
* Enables or disables size caching, enabling it will improve performance 
* where you are animating a value inside TextView. This stores the font 
* size against getText().length() Be careful though while enabling it as 0 
* takes more space than 1 on some fonts and so on. 
* 
* @param enable 
*   enable font size caching 
*/ 
public void setEnableSizeCache(final boolean enable) { 
    _enableSizeCache = enable; 
    _textCachedSizes.clear(); 
    adjustTextSize(); 
} 

private int efficientTextSizeSearch(final int start, final int end, 
            final SizeTester sizeTester, final RectF availableSpace) { 
    if (!_enableSizeCache) 
     return binarySearch(start, end, sizeTester, availableSpace); 
    final String text = getText().toString(); 
    final int key = text == null ? 0 : text.length(); 
    int size = _textCachedSizes.get(key); 
    if (size != 0) 
     return size; 
    size = binarySearch(start, end, sizeTester, availableSpace); 
    _textCachedSizes.put(key, size); 
    return size; 
} 

private int binarySearch(final int start, final int end, 
         final SizeTester sizeTester, final RectF availableSpace) { 
    int lastBest = start; 
    int lo = start; 
    int hi = end - 1; 
    int mid = 0; 
    while (lo <= hi) { 
     mid = lo + hi >>> 1; 
     final int midValCmp = sizeTester.onTestSize(mid, availableSpace); 
     if (midValCmp < 0) { 
      lastBest = lo; 
      lo = mid + 1; 
     } else if (midValCmp > 0) { 
      hi = mid - 1; 
      lastBest = hi; 
     } else 
      return mid; 
    } 
    // make sure to return last best 
    // this is what should always be returned 
    return lastBest; 
} 

@Override 
protected void onTextChanged(final CharSequence text, final int start, 
          final int before, final int after) { 
    super.onTextChanged(text, start, before, after); 
    reAdjust(); 
} 

@Override 
protected void onSizeChanged(final int width, final int height, 
          final int oldwidth, final int oldheight) { 
    _textCachedSizes.clear(); 
    super.onSizeChanged(width, height, oldwidth, oldheight); 
    if (width != oldwidth || height != oldheight) 
     reAdjust(); 
} 

}

Je trouve ces détails mis en œuvre here, ce qui était facile à imiter sur ma fin.

Répondre

1
android:textIsSelectable="true" 

valeur false si vous voulez voir votre curseur

vous ne devez pas mettre textCursorDrawable à @null parce que la couleur ne dépend que de votre choix de couleur d'accent

+0

ne fonctionne toujours pas . Peut-être est-ce en raison d'un certain décalage causé par edittext personnalisé que j'utilise qui fournit autoresize ?! Bien que la classe personnalisée étende EditText. – SagePawan

+0

Pourriez-vous poster le contenu de AutoResizeEditText.java –

+0

S'il vous plaît vérifier la modification. – SagePawan