【问题标题】:Dynamically change cursor color in EditText在 EditText 中动态更改光标颜色
【发布时间】:2018-10-26 08:38:52
【问题描述】:

我的问题是 - 如何多次更改 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 必须在相同的编辑文本中更改光标

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

如何准确改变光标颜色?

谢谢

【问题讨论】:

  • 当你按下任何一个按钮时,它会转到catch() 你能发布日志吗?
  • 您正在使用 EditText 的私有字段,不建议这样做...您在 editText 上的调用是否无效?更改drawable后尝试调用invalidate。
  • 我更新了问题,你可以检查一下。谢谢

标签: java android android-edittext cursor


【解决方案1】:

(我更新了您的问题以更清楚)。

你犯了一些错误:

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

尝试调整它,如果它解决了您的问题,请告诉我们。

【讨论】:

  • 伟大的工作... :)
【解决方案2】:

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

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"

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

【讨论】:

  • 它适合你吗?因为对我来说不是,同样的问题,首先按下的按钮正在工作
  • 你想改变每次按钮点击的颜色变化吗?我想你只想要按钮点击的颜色变化。这就是我上传它的原因。
  • 我想按 btn1 并改变光标的颜色。在我想按 btn2 并更改为另一种颜色之后。在我想再次按下 btn1 等之后......但现在只能工作首先按下的 btn。怎么修?谢谢
  • 我更新了我的代码。从此代码中,您可以在每次单击按钮后更改光标颜色。谢谢。
  • 嗨,谢谢你,你能看看我有问题的“更新 2”并帮助我吗
猜你喜欢
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 2012-07-16
  • 2016-05-22
  • 2016-02-29
  • 1970-01-01
相关资源
最近更新 更多