2014-09-23 9 views
16

W Androidzie możemy zmienić kolor kursora poprzez:Jak zmienić programowo kursor Edittext Colour w systemie Android?

android:textCursorDrawable="@drawable/black_color_cursor".

Jak możemy to zrobić dynamicznie?

W moim przypadku ustawiłem kursor na biały, ale muszę zmienić kolor na czarny. Jak to zrobić?

// Set an EditText view to get user input 
    final EditText input = new EditText(nyactivity); 
    input.setTextColor(getResources().getColor(R.color.black)); 
+0

następczych [link] (https://stackoverflow.com/questions/7238450/set-edittext-cursor-color) , najlepiej iść. – Krantiz

Odpowiedz

56

Korzystanie pewną refleksję wystarczyły mi

Java:

// https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564 
Field f = TextView.class.getDeclaredField("mCursorDrawableRes"); 
f.setAccessible(true); 
f.set(yourEditText, R.drawable.cursor); 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle" > 

    <solid android:color="#ff000000" /> 

    <size android:width="1dp" /> 

</shape> 

Oto metody, które można użyć, że nie potrzebuje XML:

public static void setCursorColor(EditText view, @ColorInt int color) { 
    try { 
    // Get the cursor resource id 
    Field field = TextView.class.getDeclaredField("mCursorDrawableRes"); 
    field.setAccessible(true); 
    int drawableResId = field.getInt(view); 

    // Get the editor 
    field = TextView.class.getDeclaredField("mEditor"); 
    field.setAccessible(true); 
    Object editor = field.get(view); 

    // Get the drawable and set a color filter 
    Drawable drawable = ContextCompat.getDrawable(view.getContext(), drawableResId); 
    drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); 
    Drawable[] drawables = {drawable, drawable}; 

    // Set the drawables 
    field = editor.getClass().getDeclaredField("mCursorDrawable"); 
    field.setAccessible(true); 
    field.set(editor, drawables); 
    } catch (Exception ignored) { 
    } 
} 
+2

Twój kod działa poprawnie! – user4152

+2

Dzięki, jesteś ratownikiem. – Baggers

4
android:textCursorDrawable="@null" 

Następnie w aplikacji:

final EditText input = new EditText(nyactivity); 
input.setTextColor(getResources().getColor(R.color.black)); 

Get from here

+0

Przepraszam, ale nie mam żadnych xml, jak to zrobić. –

5

To jest przepisany wersja funkcji z @Jared Rummler z kilka ulepszeń:

  • Wsparcie dla Androida 4.0.x
  • Specjalna funkcja getDrawable(Context, int) sience getDrawable(int) jest nieaktualna dla interfejsu API 22 i nowszych.
private static final Field 
     sEditorField, 
     sCursorDrawableField, 
     sCursorDrawableResourceField; 

static { 
    Field editorField = null; 
    Field cursorDrawableField = null; 
    Field cursorDrawableResourceField = null; 
    boolean exceptionThrown = false; 
    try { 
     cursorDrawableResourceField = TextView.class.getDeclaredField("mCursorDrawableRes"); 
     cursorDrawableResourceField.setAccessible(true); 
     final Class<?> drawableFieldClass; 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { 
      drawableFieldClass = TextView.class; 
     } else { 
      editorField = TextView.class.getDeclaredField("mEditor"); 
      editorField.setAccessible(true); 
      drawableFieldClass = editorField.getType(); 
     } 
     cursorDrawableField = drawableFieldClass.getDeclaredField("mCursorDrawable"); 
     cursorDrawableField.setAccessible(true); 
    } catch (Exception e) { 
     exceptionThrown = true; 
    } 
    if (exceptionThrown) { 
     sEditorField = null; 
     sCursorDrawableField = null; 
     sCursorDrawableResourceField = null; 
    } else { 
     sEditorField = editorField; 
     sCursorDrawableField = cursorDrawableField; 
     sCursorDrawableResourceField = cursorDrawableResourceField; 
    } 
} 

public static void setCursorColor(EditText editText, int color) { 
    if (sCursorDrawableField == null) { 
     return; 
    } 
    try { 
     final Drawable drawable = getDrawable(editText.getContext(), 
       sCursorDrawableResourceField.getInt(editText)); 
     drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); 
     sCursorDrawableField.set(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN 
       ? editText : sEditorField.get(editText), new Drawable[] {drawable, drawable}); 
    } catch (Exception ignored) { 
    } 
} 

private static Drawable getDrawable(Context context, int id) { 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { 
     return context.getResources().getDrawable(id); 
    } else { 
     return context.getDrawable(id); 
    } 
} 
+0

świetnie, ale myślę, że lepiej zastąpić niestandardową metodę 'getDrawable (context, resId)' z 'ContextCompat.getDrawable (context, resId)' - ta sama metoda po wyjęciu z pudełka;) –

1

Udało się to zrobić przez:

  1. Tworzenie pliku układ z tylko EditText i kolor kursora ustawić w xml na nim.
  2. pompowania
  3. Używanie EditText jak można używać programowo stworzył jedną
Powiązane problemy