繁体   English   中英

在EditText中动态更改光标颜色

[英]Dynamically change cursor color in EditText

我的问题是-如何多次更改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. 是的,这是我的错

我添加了显示Log catch的内容,但里面没有任何内容

我使用了公共场所

它没有解决我的问题,有什么不同的想法吗?

更新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();
}

如何准确改变光标的颜色?

谢谢

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

您犯了一些错误:

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

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

我试图按照以下方式解决您的问题:

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"

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM