在EditText中动态更改光标颜色

时间:2018-10-26 08:38:52

标签: java android android-edittext cursor

我的问题是-如何多次更改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必须在同一edittext中更改光标

  1. 我需要使用View v吗?

  2. 是的,这是我的错误

我添加了显示“登录捕获”,但其中没有任何内容

我使用了公共场所

它不能解决我的问题,有其他想法吗?

更新2

Maulik Panchal感谢您的帮助。 这行得通。 抱歉,我没有注意到您在上一个代码中使用“ if”拒绝第二次更改颜色。

但是现在我看到了您的代码,并且有几个问题。

您使用“ 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 :(得分:0)

(我更新了您的问题,使其更加清楚)。

您犯了一些错误:

  • 您对btn1和btn2使用相同的Field f和EditText editText
  • 您永远不会使用参数View v?
  • 您有重复的源代码行(已编辑)

尝试调整它,让我们知道它是否可以解决您的问题。

答案 1 :(得分:0)

我尝试按照以下方法解决您的问题:

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"

这是您的解决方案。谢谢:)