Динамически менять цвет курсора в EditText - PullRequest
0 голосов
/ 26 октября 2018

У меня вопрос - Как изменить цвет курсора в EditText более одного раза.

У меня есть editText и два btn для изменения цвета курсора

public class MainActivity extends AppCompatActivity {

    public EditText editText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText) findViewById(R.id.edit_text);
        editText.setText(Html.fromHtml("5+6+3<sup>2</sup>+6"));
    }

    public void btn1(View v){
        try {
            Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
            f = TextView.class.getDeclaredField("mCursorDrawableRes");
            f.setAccessible(true);
            f.set(editText, R.drawable.cursor);
        } catch (Exception e) {
            Log.e("ALERT", "exception: " + e.getMessage());
            Log.e("ALERT", "exception: " + e.toString());
            e.printStackTrace();
        }

        editText.invalidate();

    }

    public void btn2(View v){
        try {
            Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
            f = TextView.class.getDeclaredField("mCursorDrawableRes");
            f.setAccessible(true);
            f.set(editText, R.drawable.cursor_exponent);
        } catch (Exception e) {
            Log.e("ALERT", "exception: " + e.getMessage());
            Log.e("ALERT", "exception: " + e.toString());
            e.printStackTrace();
        }

        editText.invalidate();
    }
}

Когда я запускаю приложениеи нажмите btn1, произойдет смена цвета.

Но после того, как я нажму btn2, цвет не изменится.

Если закрыть приложение и запустить снова, а затем нажать кнопку btn2, цвет меняется.

Но после, если я нажму btn1, цвет не изменится.

Как это исправить?

Спасибо.

ОБНОВЛЕНО

Я обновил код в вопросе

1.1.Используется другое поле f

1.2.Мне нужно использовать тот же EditText, потому что этот btn должен изменить курсор в том же тексте редактирования

Для чего мне нужно использовать View v?

Да, это моя ошибка

Я добавил показывать в журнале catch, новнутри ничего не было

И я использовал открытое поле

Это не решило мою проблему, есть другая идея?

ОБНОВЛЕНО 2

Маулик Панчал спасибо за помощь.Это работает.Извините, я не заметил, что в вашем последнем коде вы используете "если" для второго изменения цвета.

Но теперь я вижу ваш код и у меня есть несколько вопросов.

Вы используете "editText.getBackground().mutate().setColorFilter(...);" для изменения цвета фона.

Я хочу изменить цвет курсора, и я посмотрел и не нашел опции в editText для изменения цвета курсора.

И если я использую свой старыйКод детали для изменения цвета курсора работает только в первый раз

try {
    Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
    f = TextView.class.getDeclaredField("mCursorDrawableRes");
    f.setAccessible(true);
    f.set(editText, R.drawable.cursor_exponent);
} catch (Exception e) {
    Log.e("ALERT", "exception: " + e.getMessage());
    Log.e("ALERT", "exception: " + e.toString());
    e.printStackTrace();
}

Как точно изменить цвет курсора?

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Я пытался решить вашу проблему, как показано ниже:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    EditText editText;
    Button btnRed, btnGreen;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = findViewById(R.id.et);
        btnGreen = findViewById(R.id.green);
        btnRed = findViewById(R.id.red);
        btnRed.setOnClickListener(this);
        btnGreen.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.red:
                    editText.getBackground().mutate().setColorFilter(getResources().getColor(android.R.color.holo_blue_light), PorterDuff.Mode.SRC_ATOP); 
                break;
            case R.id.green:
                    editText.getBackground().mutate().setColorFilter(getResources().getColor(android.R.color.holo_green_dark), PorterDuff.Mode.SRC_ATOP);  
                    break;
        }
    }
}

Решение для Update2: -

Вы можете изменить курсор и подчеркнуть ниже вашего текста с помощью кода ниже ..

Прежде всего создайте один стиль в своем разделе style.xml:

<style name="AppTheme2" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorAccent">your color</item>
    </style>

после этого просто добавьте эту строку в ваш EditText:

android:theme="@style/AppTheme2"

Это ваши решения..Спасибо:)

0 голосов
/ 26 октября 2018

(я уточнил ваш вопрос, чтобы быть более понятным).

Вы сделали несколько ошибок:

  • вы используете одно и то же Поле f и EditText editText для обоих btn1 и btn2
  • вы никогда не используете параметр View v?
  • у вас есть дубликаты исходных строк (отредактировано)

Попробуйте адаптировать это и дайте нам знать, если это решит вашу проблему.

...