android:textColor实际上没有起作用

4

enter image description here我的应用程序中有一个Edittext。 我在XML中以以下方式将其默认颜色设置为黑色:

android:textColor="@android:color/black"

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/layout"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            tools:context="scientificcalculatorapp.scientificcalculator.ScientificCalculator"
            android:weightSum="1"
            android:orientation="vertical"
            android:layout_alignParentBottom="true">
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:background="@android:color/transparent"
                android:focusable="true"
                android:focusableInTouchMode="true">
            </LinearLayout>
            <EditText
                android:layout_width="match_parent"
                android:layout_height="48dp"
                android:textAppearance="?android:attr/textAppearanceLarge"
                android:id="@+id/Output"
                android:enabled="true"
                android:focusable="true"
                android:longClickable="true"
                android:inputType="text"
                android:textIsSelectable="true"
                android:cursorVisible="true"
                android:textColor="@android:color/black"
                android:bufferType="spannable"
                android:background="@android:color/darker_gray"
                android:allowUndo="true" />
</LinearLayout>

当我从我的键盘获取输入时,这个方法可以工作,但是当我从另一个应用程序复制的颜色不同的内容粘贴到这个EditText中时,文本会以其他颜色而不是黑色的形式出现。

如何使文本的颜色标准化为黑色,无论我从哪种颜色复制它。

更新:

output.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable s) {
                String yourCopiedString=output.getText().toString();
                int length = yourCopiedString.length();
                Spannable spannable= new SpannableString(yourCopiedString);
                //set color
                //set size
                spannable.setSpan(new ForegroundColorSpan(Color.BLACK), 0,length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                spannable.setSpan(new RelativeSizeSpan(5.0f), 0,length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                output.setText(spannable);
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start,
                                          int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start,
                                      int before, int count) {
            }
        });

我的背景颜色已经设置为较深的灰色。但是,如果我粘贴绿色文本,则在我的编辑文本中会得到绿色文本。我既没有得到黑色(我想要的),也没有像@SatanPandey所提到的灰色。 - Anurag Joshi
请发布您的 layout 文件。 - Satan Pandeya
android:textAppearance="?android:attr/textAppearanceLarge" 是一个系统值,我猜它并没有完全定义颜色、样式等。我认为你需要用自己的样式来尝试一下。这只是一个尝试,我不知道它是否能解决问题。这里有一个简单的例子,可以看看Sebastian Roth的答案,像那样尝试一下。https://dev59.com/NW435IYBdhLWcg3wkBBe - Opiatefuchs
PS:在那个链接中,是另一个问题,我只是想向您展示如何使用自定义样式,所以不用关心主题... - Opiatefuchs
也尝试过了@IshanFernando,但是不起作用。 - Anurag Joshi
显示剩余16条评论
2个回答

0

复制粘贴的行为因供应商添加的功能而异。

我的建议是,为您的editText设置一个onFocusChangeListener,当EditText失去焦点时再次覆盖textColor!这是一个简单的解决方法。试一试,然后告诉我。

更新:
由于您只有一个EditText字段,它永远不会失去焦点,上述解决方案需要进行一些微调。

在布局中,添加另一个EditText字段。将其可见性设置为GONE。对于现有的EditText字段,添加android:imeOptions="actionNext"
在您的活动中,将新添加的'EditText`字段的输入类型设置为TYPE_NULL。现在,当用户按下键盘中的“下一个”按钮时,您的EditText将失去焦点,从而更改文本颜色。这是一个解决方法,而不是一个解决方案。


你好。我尝试了这个:output.setOnFocusChangeListener(new View.OnFocusChangeListener() { public void onFocusChange(View v, boolean hasFocus) { if(!hasFocus) { output.setTextColor(Color.BLACK); } } }); - Anurag Joshi
但是再次获得相同的绿色。 - Anurag Joshi
你能对复制的内容执行数学运算吗? - Nishanth Sreedhara
但为了保持UI的一致性,我希望所有复制/粘贴的文本都是黑色的。 - Anurag Joshi
看起来你只有一个EditText字段,而且它没有失去焦点。 - Nishanth Sreedhara
显示剩余2条评论

0

好的,这里是一个尝试。我不知道它是否解决了问题,但需要展示代码。首先创建一个样式:

<style name="NormalText" parent="@android:style/TextAppearance">
        <item name="android:textColor">@android:color/black</item>
        <item name="android:textSize">15sp</item>
 </style>

然后将一个 TextWatcher 添加到你的 EditText 中。
output.addTextChangedListener(new TextWatcher(){

       @Override
   public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

       @Override
   public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

       @Override
   public void afterTextChanged(Editable s) {


           }
}

创建一个全局布尔值和ClipboardManager:
 private ClipboardManager clipBoard;
 private boolean addedToClipboard = false;

初始化并向管理器添加监听器:

 clipBoard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
        clipBoard.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {
            @Override
            public void onPrimaryClipChanged() {

                addedToClipboard = true;
            }
        });

然后在AfterTextChanged中执行以下操作:

    @Override
public void afterTextChanged(Editable s) {
     Log.d("TAPPJABB", "AFTER TEXT CHANGED:" + s);
     if (addedToClipboard == true) {
      String yourCopiedString = output.getText().toString();
      int length = yourCopiedString.length();
      Spannable spannable = new SpannableString(yourCopiedString);//set color
      spannable.setSpan(new ForegroundColorSpan(Color.BLACK), 0, length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
      spannable.setSpan(new RelativeSizeSpan(5.0f), 0, length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
      addedToClipboard = false;
      output.setText(spannable);

   }
 }

在这里遵循顺序是很重要的,以避免无限循环。布尔值防止普通输入被格式化,在这个例子中仅适用于剪贴板粘贴。

但正如你所提到的,如果你想多次粘贴它,它就不起作用了,这通常不会在一个EditText上执行。问题在于,谷歌没有为我们提供任何粘贴监听器或其他解决方案,至少我没有找到任何东西。


嗨。抱歉回复晚了,但很遗憾,这个方法并没有起作用。我在粘贴后仍然看到绿色。 - Anurag Joshi
好的,再试一次...尝试使用Spannable,并在粘贴之前将其设置为您的字符串。 - Opiatefuchs
我并没有通过编程的方式执行粘贴操作。我是使用 android:textIsSelectable="true" 来自动化剪切、复制和粘贴过程的。 - Anurag Joshi
好的,请检查TextWatcher。也许您可以将这两种方法结合起来。如果粘贴了文本,则TextChangedListener应该抛出一个事件。然后从editText复制文本,使其可跨度,并将其设置为editText。 - Opiatefuchs
是的,我给你发了一条消息。它有点起作用,但只在第一次尝试时。 - Anurag Joshi
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接