3

我正在使用文本编辑器。如何在点击Spinner时不会丢失文本选择?

我有一个EditText小部件,其中输入文本,并在下面用各种格式化小部件(如按钮和Spinner)输入一行。

用户可以选择文本,然后按下按钮来打开和关闭粗体,斜体和其他格式化选项,这可以毫无困难地工作。

但是,对于用户可以在运行Android 4.1或运行4.2.2的Nexus 4/7/10的Asus平板电脑上选择颜色或字体等东西的Spinner,文本选择会尽快消失点击Spinner

在Samsung Galaxy SII上,此行为不会发生。选择在整个与Spinner的互动中保持不变。 (它运行Android 4.0.4,我不确定这个问题是否与Android版本相关,或者由于三星采取了不同的做法)。

我想在每台设备上都有三星的行为。我如何确保这是默认行为?

+0

在运行4.0.3的模拟器上测试之后,似乎标准Android失去了焦点。所以不知何故,三星在默认行为方面有一些差异,我想在其他设备上进行复制。 – Michel 2013-03-04 23:12:10

+0

运行调试程序显示,通过长时间的调用堆栈,正在调用onWindowsFocusChanged,可能会将焦点置于微调器弹出对话框,并调用Editor onDestroyActionMode(ActionMode模式),最终删除文本选择。所以也许我需要设置一个自定义动作模式来避免这个问题,或者在调用超级版本并将其恢复之前将选择保存在onWindowsFocusChanged中,但我不确定这种方法可能会产生什么样的负面影响...... – Michel 2013-03-04 23:57:46

+0

覆盖这些钩子来保存和恢复选择状态似乎是对我来说合理的解决方案。 – FoamyGuy 2013-03-05 01:56:41

回答

3

创建具有以下重写一个自定义的EditText类的伎俩:

@Override 
public void onWindowFocusChanged (boolean hasWindowFocus) { 
    boolean hadSelection = this.hasSelection(); 
    int start=0, end=0; 
    if(hadSelection) { 
     start = getSelectionStart(); 
     end = getSelectionEnd(); 
    } 
    super.onWindowFocusChanged(hasWindowFocus); 
    if(hadSelection) { 
     setSelection(start, end); 
    } 
} 

我不能完全确定,在某些情况下,可能不会产生一些不必要的副作用。如果您使用此功能并遇到任何问题,请发布评论或发布避开它们的解决方案。

+0

没有必要首先检查hasSelection(),所以我没有,但是我可以报告说,在运行Amazon的系统版本7.3.1的Kindle Fire HD上,这很好。 – MandisaW 2013-04-20 22:31:36

+0

精湛,拯救了我的生命:) – iBabur 2015-06-03 11:43:23

相关问题