缺少 EditText 选择锚点
EditText Selection Anchors Missing
我刚刚注意到我的应用程序中的所有 EditText
字段都没有正确显示选择锚点。例如:
但是,我期望出现的是正确的锚点,例如:
我的应用中受影响 EditText
的典型示例:
<EditText
android:id="@+id/text_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/button_send"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:inputType="text|textShortMessage"
android:layout_marginRight="4dp"
android:hint="@string/hint_chat_send" />
另请注意,"paste" 悬停视图在我的应用程序中有一个奇怪的白色边框,但在其他应用程序中它是完全透明的。
我怀疑是某种主题问题,因为它会影响我的应用程序中的多个屏幕,但我找不到有关哪些属性可能导致此问题的信息。
更新
所以,我花了 几个 太多时间来调试 EditText
、TextView
和 Editor
框架 类 无济于事。一切似乎都在按预期运行。
我在同一个应用程序中创建了一个新的空白 Activity
,布局如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<EditText
android:layout_width="300dp"
android:layout_height="wrap_content"
android:hint="test" />
</RelativeLayout>
在我的其他屏幕中,我使用的是 AppCompat 库及其相关主题,但在这个 Activity
中,我覆盖了主题,Activity 成为股票 Android Activity
内置 Material 主题:
public class TestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(android.R.style.Theme_Material_Light_NoActionBar);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
}
...
据我了解,以这种方式调用 setTheme
应该会覆盖我的应用程序 styles.xml
中的任何可能的自定义设置。不过,我看到了这个:
这里还是有点不知所措...
负责绘制手柄的 class 是位于编辑器 class 中的 SelectionModifierCursorController。为了不显示光标(左右选择光标),必须在实例上调用 hide。例如,当视图的触摸模式发生变化时就会这样做。
http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/widget/Editor.java#3976
或者如果 TextViews(EditTexts 基本上是文本视图)textCanBeSelected returns false:
http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/widget/Editor.java#479
或者其他几种情况,先从这里开始排查吧
为确保触摸模式没有任何问题,您能否在一个有效的 EditText 和一个无效的 EditText 上调用 isInTouchMode?
为确保 textCanBeSelected 正确无误,您能否在一个有效的 EditText 和一个无效的 EditText 上调用该方法。
如果这两个都没有问题,我们将不得不继续挖掘 ;)
解决方案是删除我在主题中设置的 android:popupBackground
:
<!-- This will break the text selection popup -->
<item name="android:popupBackground">@color/not_quite_white</item>
我有这个设置来尝试将所有 Spinner
下拉菜单背景设置为相同的颜色。无论出于何种原因,它都会干扰文本选择弹出窗口。此外,调用 Activity.setTheme
显然没有覆盖此 属性,导致一些混乱。
我刚刚注意到我的应用程序中的所有 EditText
字段都没有正确显示选择锚点。例如:
但是,我期望出现的是正确的锚点,例如:
我的应用中受影响 EditText
的典型示例:
<EditText
android:id="@+id/text_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/button_send"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:inputType="text|textShortMessage"
android:layout_marginRight="4dp"
android:hint="@string/hint_chat_send" />
另请注意,"paste" 悬停视图在我的应用程序中有一个奇怪的白色边框,但在其他应用程序中它是完全透明的。
我怀疑是某种主题问题,因为它会影响我的应用程序中的多个屏幕,但我找不到有关哪些属性可能导致此问题的信息。
更新
所以,我花了 几个 太多时间来调试 EditText
、TextView
和 Editor
框架 类 无济于事。一切似乎都在按预期运行。
我在同一个应用程序中创建了一个新的空白 Activity
,布局如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<EditText
android:layout_width="300dp"
android:layout_height="wrap_content"
android:hint="test" />
</RelativeLayout>
在我的其他屏幕中,我使用的是 AppCompat 库及其相关主题,但在这个 Activity
中,我覆盖了主题,Activity 成为股票 Android Activity
内置 Material 主题:
public class TestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(android.R.style.Theme_Material_Light_NoActionBar);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
}
...
据我了解,以这种方式调用 setTheme
应该会覆盖我的应用程序 styles.xml
中的任何可能的自定义设置。不过,我看到了这个:
这里还是有点不知所措...
负责绘制手柄的 class 是位于编辑器 class 中的 SelectionModifierCursorController。为了不显示光标(左右选择光标),必须在实例上调用 hide。例如,当视图的触摸模式发生变化时就会这样做。
http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/widget/Editor.java#3976
或者如果 TextViews(EditTexts 基本上是文本视图)textCanBeSelected returns false: http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/widget/Editor.java#479
或者其他几种情况,先从这里开始排查吧
为确保触摸模式没有任何问题,您能否在一个有效的 EditText 和一个无效的 EditText 上调用 isInTouchMode?
为确保 textCanBeSelected 正确无误,您能否在一个有效的 EditText 和一个无效的 EditText 上调用该方法。
如果这两个都没有问题,我们将不得不继续挖掘 ;)
解决方案是删除我在主题中设置的 android:popupBackground
:
<!-- This will break the text selection popup -->
<item name="android:popupBackground">@color/not_quite_white</item>
我有这个设置来尝试将所有 Spinner
下拉菜单背景设置为相同的颜色。无论出于何种原因,它都会干扰文本选择弹出窗口。此外,调用 Activity.setTheme
显然没有覆盖此 属性,导致一些混乱。