Android EditText不获取焦点和监听

本文介绍如何使用Android中EditText组件的TextWatcher接口来监听文本变化,并提供了获取光标位置、插入和删除字符等实用方法。

不获取焦点

链接:http://blog.youkuaiyun.com/subaohao/article/details/9043895

监听

/*监听 编辑框中的文本改变事件*/  
editText.addTextChangedListener(new TextWatcher() {  
         @Override  
         //文本改变时调用该方法
         public void onTextChanged(CharSequence s, int start, int before, int count) {  
                if(null != text_){  
                    text_.setText("您正在输入......\n当前光标处在第 " + start  
                            +" 个位置\n您选择处理了 " + before + " 个字符\n您这次输入的词语有 "  
                           + count + " 个字符");  
                }  

            }  

          @Override
          //文本改变前调用该方法  
          public void beforeTextChanged(CharSequence s, int start, int count,  
                            int after) {  
                //这里的count树枝上是和onTextChanged()里的before一样的after树枝上是和onTextChanged()里的count一样的 
                if(null != text1_){  
                    text1_.setText("您正在输入......\n当前光标处在第 " + start  
                            +" 个位置\n您选择处理了 " + count + " 个字符\n您这次输入的词语有 "  
                            + after + " 个字符");  
                }  
            }  

            @Override
            //文本改变后调用该方法  
            public void afterTextChanged(Editable s) {  
                /*++这里显示出输入的字符串++*/  
                if(null != text2_){  
                    text2_.setText(s);  
                }  
            }  

});  

editText相关方法
1.获取光标位置

int index = editText.getSelectionStart();  

2.在光标处插入字符

int index = editText.getSelectionStart();  
Editable editable = editText.getText();  
editable.insert(index, "aaaa");  

3.删除光标前字符

int index = editText.getSelectionStart();  
Editable editable = editText.getText();  
editable.delete(index-1, index); 
<think>我们需要解决的是:当进入一个包含EditText的Activity时,EditText会自动获取焦点并弹出软键盘,同时显示光标。但有时我们希望进入时EditText自动获取焦点,也显示光标,直到用户点击它。 解决方法: 1. 在Activity的根布局中设置焦点:在根布局中添加`android:focusable="true"``android:focusableInTouchMode="true"`,这样当Activity启动时,焦点会首先落在根布局上,而EditText。 2. 在EditText中设置显示光标:可以通过设置`android:cursorVisible="false"`,然后在用户点击时再显示光标(通过设置一个OnFocusChangeListener或OnTouchListener来在获取焦点时显示光标)。 另一种方法是在AndroidManifest.xml中为该Activity设置窗口自动获取焦点: <activity android:name=".YourActivity" android:windowSoftInputMode="stateHidden"/> 但是,这只能隐藏软键盘,并能阻止EditText获取焦点显示光标。 下面是一个示例布局代码: 布局文件(activity_main.xml): ```xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:focusable="true" android:focusableInTouchMode="true"> <!-- 其他视图 --> <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入" android:cursorVisible="false"/> <!-- 初始显示光标 --> </LinearLayout> ``` 在Activity中,我们可以为EditText设置焦点变化监听,当获取焦点时显示光标,失去焦点时隐藏光标(可选): ```java public class MainActivity extends AppCompatActivity { private EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = findViewById(R.id.editText); editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { // 当EditText获得焦点时,显示光标;失去焦点时,隐藏光标(可选) editText.setCursorVisible(hasFocus); } }); // 如果你希望在用户触摸EditText时(即使没有获得焦点)也显示光标,可以设置OnTouchListener editText.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { // 确保已经获取焦点(因为可能还没有焦点editText.requestFocus(); // 显示光标 editText.setCursorVisible(true); } return false; } }); } } ``` 解释: 1. 根布局设置了`android:focusable="true"``android:focusableInTouchMode="true"`,这样当Activity启动时,根布局会首先获取焦点,从而EditText会自动获取焦点。 2. EditText设置了`android:cursorVisible="false"`,所以初始时光标会显示。 3. 通过设置OnFocusChangeListener,当EditText获取焦点时显示光标,失去焦点时隐藏光标(根据需求,失去焦点时隐藏光标是可选的)。 4. 另外,设置OnTouchListener是为了在用户触摸EditText时(比如第一次触摸,此时可能还没有焦点)确保获取焦点并显示光标。 注意:有时如果布局中有多个可聚焦的控件,可能需要确保根布局首先获取焦点。 另外,也可以考虑在Activity启动时隐藏软键盘: ```java getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); ``` 但是,上述方法只是隐藏了软键盘,并影响焦点获取。 以上方法可以满足进入Activity时EditText自动获取焦点显示光标的需求。 §§相关问题§§: 1. 如何让Android应用启动时隐藏软键盘? 2. 如何在EditText失去焦点时隐藏软键盘? 3. Android中除了EditText,还有哪些常见的可聚焦控件? 4. 如何设置EditText的默认提示文本(hint)并改变其颜色? </think>### Android EditText 进入页面时获取焦点显示光标 在 Android 中,通过 XML 属性代码控制可以实现 EditText 进入页面时自动获取焦点显示光标。以下是完整解决方案: #### 方案 1:XML 属性配置(推荐) ```xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:focusable="true" android:focusableInTouchMode="true"> <!-- 关键1:根布局获取焦点 --> <!-- 其他视图组件 --> <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入内容" android:cursorVisible="false" <!-- 关键2:初始隐藏光标 --> android:focusable="false" /> <!-- 关键3:禁用自动聚焦 --> </LinearLayout> ``` #### 方案 2:Java/Kotlin 代码控制 ```kotlin class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 根布局获取焦点 findViewById<View>(R.id.root_layout).apply { isFocusable = true isFocusableInTouchMode = true requestFocus() } // 设置EditText行为 findViewById<EditText>(R.id.editText).apply { // 初始状态设置 isCursorVisible = false isFocusable = false // 点击时显示光标并获取焦点 setOnClickListener { isFocusable = true isFocusableInTouchMode = true requestFocus() isCursorVisible = true showKeyboard() } } } // 显示软键盘 private fun showKeyboard() { val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT) } } ``` #### 关键原理说明: 1. **根布局获取焦点** 通过设置 `android:focusable="true"` `android:focusableInTouchMode="true"` 使根布局优先获取焦点 2. **EditText 初始状态** - `android:cursorVisible="false"`:隐藏光标 - `android:focusable="false"`:禁用自动获取焦点 3. **动态行为控制** 当用户点击 EditText 时: - 启用焦点 (`isFocusable = true`) - 显示光标 (`isCursorVisible = true`) - 请求焦点 (`requestFocus()`) - 弹出软键盘 #### 方案 3:清单文件控制软键盘(辅助方案) ```xml <!-- AndroidManifest.xml --> <activity android:name=".MainActivity" android:windowSoftInputMode="stateHidden|stateAlwaysHidden" /> ``` > 说明:仅隐藏软键盘,需配合上述方案使用 #### 完整效果: 1. 进入页面时 EditText焦点、无光标 2. 点击 EditText 后自动获取焦点、显示光标并弹出键盘 3. 符合 Android 设计规范的用户体验
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值