之前写过一篇博客,简单的介绍了Android
隐藏EditText的焦点
,之所以要隐藏EditText的焦点,是因为当应用在第一次进入某个Activity时,由于该页面中的EditText获取了焦点,致使键盘弹出,而影响了用户的体验。

今天扩展下之前的内容,简单介绍如何动态设置某个控件获取到焦点。

首先,定义页面布局:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6.  
  7. <LinearLayout
  8. android:id="@+id/edit_layout"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:focusable="true"
  12. android:focusableInTouchMode="true"
  13. android:orientation="vertical" >
  14.  
  15. <EditText
  16. android:id="@+id/edit_name"
  17. android:layout_width="fill_parent"
  18. android:layout_height="wrap_content"
  19. android:hint="姓名"
  20. android:inputType="text"
  21. android:minHeight="50dp" />
  22.  
  23. <EditText
  24. android:id="@+id/edit_mobile"
  25. android:layout_width="fill_parent"
  26. android:layout_height="wrap_content"
  27. android:hint="手机号"
  28. android:inputType="phone"
  29. android:minHeight="50dp" />
  30. </LinearLayout>
  31.  
  32. <Button
  33. android:layout_width="fill_parent"
  34. android:layout_height="wrap_content"
  35. android:layout_marginTop="30dp"
  36. android:text="确定"
  37. android:onClick="setFocus"
  38. />
  39.  
  40. </LinearLayout>

观察下,我已经对两个EditText的父容器LinearLayout设置了两行代码android:focusable="true",android:focusableInTouchMode="true"。有了这两行代码,当我们进入该Activity时,便不会弹出软键盘啦。

下面,我们对两个文本输入框定义焦点事件:

  1. private class OnFocusHandler implements OnFocusChangeListener {
  2. @Override
  3. public void onFocusChange(View v, boolean hasFocus) {
  4. switch (v.getId()) {
  5. case R.id.edit_name:
  6.  
  7. if (hasFocus) {
  8. edit_name.setText("ning shuai");
  9. } else {
  10. edit_name.setText("");
  11. }
  12. break;
  13. case R.id.edit_mobile:
  14. if (hasFocus) {
  15. edit_mobile.setText("963258741");
  16. } else {
  17. edit_mobile.setText("");
  18. }
  19. break;
  20. }
  21. }
  22. }

焦点事件很容易理解,不多讲了。最后,我们定义Button的点击事件,在这个事件中,我们让两个EditText的父容器LinearLayout动态获取焦点。效果是,当点击Button时,两个EditText输入框中的内容同时清空。

  1. public void setFocus(View view) {
  2.  
  3. edit_layout.setFocusable(true);
  4. edit_layout.setFocusableInTouchMode(true);
  5.  
  6. edit_layout.requestFocus();
  7. edit_layout.requestFocusFromTouch();
  8. }

注意下,edit_layout.requestFocus();edit_layout.requestFocusFromTouch();这两行代码是必须添加的,不然LinearLayout是无法获取到焦点的!



    好了,就是如此简单的内容,把整个Activity的代码给大家看下,就不上传源码了。

  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.util.Log;
  4. import android.view.View;
  5. import android.view.View.OnFocusChangeListener;
  6. import android.widget.Button;
  7. import android.widget.EditText;
  8. import android.widget.LinearLayout;
  9.  
  10. public class MainActivity extends Activity {
  11.  
  12. private static final String TAG = "MainActivity";
  13.  
  14. private LinearLayout edit_layout;
  15.  
  16. private EditText edit_name;
  17.  
  18. private EditText edit_mobile;
  19.  
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_main);
  24.  
  25. edit_layout = (LinearLayout) findViewById(R.id.edit_layout);
  26. edit_name = (EditText) findViewById(R.id.edit_name);
  27. edit_mobile = (EditText) findViewById(R.id.edit_mobile);
  28.  
  29. this.edit_name.setOnFocusChangeListener(new OnFocusHandler());
  30. this.edit_mobile.setOnFocusChangeListener(new OnFocusHandler());
  31. }
  32.  
  33. public void setFocus(View view) {
  34.  
  35. edit_layout.setFocusable(true);
  36. edit_layout.setFocusableInTouchMode(true);
  37.  
  38. edit_layout.requestFocus();
  39. edit_layout.requestFocusFromTouch();
  40. }
  41.  
  42. private class OnFocusHandler implements OnFocusChangeListener {
  43. @Override
  44. public void onFocusChange(View v, boolean hasFocus) {
  45. switch (v.getId()) {
  46. case R.id.edit_name:
  47.  
  48. if (hasFocus) {
  49. edit_name.setText("ning shuai");
  50. } else {
  51. edit_name.setText("");
  52. }
  53. break;
  54. case R.id.edit_mobile:
  55. if (hasFocus) {
  56. edit_mobile.setText("963258741");
  57. } else {
  58. edit_mobile.setText("");
  59. }
  60. break;
  61. }
  62. }
  63. }
  64. }

看下最后的效果:

怎么样,了解吧,希望能帮助大家解决某些问题!

Android 动态设置控件获取焦点的更多相关文章

  1. Android 动态设置控件高度

    TextView textView= (TextView)findViewById(R.id.textview); LinearLayout.LayoutParams linearParams =(L ...

  2. android 动态设置控件宽高度

    Android 代码里直接使用 setWidth() 和 setHeight()设置宽高度是没用的. 解决办法是 改用setLayoutParams()方法 如设置宽高内容自适应: setLayout ...

  3. android屏幕适配的全攻略3-动态获取手机屏幕宽高及动态设置控件宽高

    1.获取手机屏幕宽高: DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetr ...

  4. android动态增加控件时控制样式的方法

    在学习android的动画时,发现所谓的tween动画只是改变绘制效果并不改变原控件的位置时是颇为失望的,虽然3.0之后已经有了property animation,但是由于要兼容老版本的androi ...

  5. android 开发-设置控件/view的水平方向翻转

    设置控件沿着水平方向翻转(即Y轴180°) 看效果: 代码: <pl.droidsonroids.gif.GifImageView android:id="@+id/gv_image1 ...

  6. Android中设置控件的背景颜色的方式整理

    版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 在Android开发中,经常需要设置控件的背景颜色或者图片的src颜色. 效果图 代码分析 根据使用的方法不同,划分为 setBackgro ...

  7. android 动态改变控件位置和大小 .

    动态改变控件位置的方法: setPadding()的方法更改布局位置. 如我要把Imageview下移200px:             ImageView.setPadding( ImageVie ...

  8. android中设置控件获得焦点 (转)

    android中,要使控件获得焦点,需要先setFocus,再requestFocus. 以Button为例:                 btn.setFocusable(true);      ...

  9. android中设置控件获得焦点

    android中,要使控件获得焦点,需要先setFocus,再requestFocus. 以Button为例:                btn.setFocusable(true);       ...

随机推荐

  1. 操作系统 Lab1

    练习1 1 ucore.img 是如何生成的 使用 make V= 查看详细的步骤 cc kern/init/init.c 使用cc工具进行预处理 gcc -Idir 将dir 作为查找目录(头文件) ...

  2. Leetcode16.3Sum Closest最接近的三数之和

    给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只存在唯一答案. 例如,给定数 ...

  3. html DOM(CSS放置位置的问题)

    转载自: http://www.php.cn/div-tutorial-386900.html (本文对读者有帮助的话请移步支持原作者) 笔记: 这样会先加载css的样式,在渲染dom的时候已经知道了 ...

  4. Poj 2796 单调栈

    关于单调栈的性质,和单调队列基本相同,只不过单调栈只使用数组的尾部, 类似于栈. Accepted Code: /******************************************* ...

  5. DataGrid无故多一行空白行

    DataGrid绑定datatable时, Datagrid.Itemsource=dt.DefaultView: 发现DataGRID会多处一行 解决如下: 对Datagrid的CanUserAdd ...

  6. win7下装双系统win8安装及问题

    配置:笔记本 联想S510p 准备:老毛桃UEFI版    8gU盘  win8 X64系统 问题1:出现 error 10099:invalid target partition specified ...

  7. JS DOM节点的增删改查

    合并拆分 行内样式  script写在html里面

  8. vue-cli3 关闭eslint

    关闭eslint 直接注释掉package.json文件中eslint的配置就可以了(以下是vue-cli的默认配置) "eslintConfig": { "root&q ...

  9. Sentinel 1.5.0 正式发布,引入 Reactive 支持

    近日,流控降级组件 Sentinel 的又一个里程碑版本 1.5.0 正式发布. 该版本引入 Reactive 的支持,并提供多项新特性与改进.从 1.5.0 版本开始,Sentinel 仅支持 JD ...

  10. 【POJ 3294】Life Forms

    [链接]h在这里写链接 [题意] 给你n个字符串. 让你找最长的字符串s; 这个s在超过一半的子串里面都有出现过且长度大于n/2; 如果有多个,输出多行. (按字典序输出) 也没说会不会出现大写. [ ...