ViewPager中嵌套Fragment中的EditText设置requestFocus无法获取焦点的解决方法

最近开发任务中遇到一个问题,登录注册页面是放在一个页面中可以切换的,所以很自然想到了用TabLayout+ViewPager+Fragment实现,在登录页面有一个逻辑是,如果用户之前登录过,则获取之前登录的账号,设置到账号输入框,然后让密码输入框获取焦点弹出键盘。

但是按照这样的逻辑写完之后,发现每次执行了密码输入框执行了requestFocus方法,但是无法获取焦点。焦点默认还是在账号框。

这里给出解决方法:

原因:
查资料分析了一下,可能是以下问题:
Android加载刷新UI的时候,是从左到右,从上到下的顺序,正在加载的过程中,如果此时requestFocus(),的话,有可能此时还没把整个界面刷新好,导致requestFocus无效。

解决办法

延迟几毫秒再获取焦点

用RxJava定时方法:

Observable.timer(200, TimeUnit.MILLISECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        mEtPassword.requestFocus();//密码框获取焦点

                    }
                });

用普通的方法延迟方法:

mEtPassword.postDelayed(new Runnable() { 
  @Override 
  public void run() { 
    mPassWord.requestFocus(); 
  } 
}, 200); 

这样就解决了这个问题了!恭喜!可以开心的休周末了!

这里在进行一个扩展知识

有时候我们需要设置一些布局的属性

通常我们在Fragment中引用到布局文件中一个EditText组件后会出现无法编辑,点击没反应,这时候应该在布局文件中设置属性:descendantFocusability 它有三个属性值。
(1) beforeDescendants:viewgroup会优先其子类控件而获取到焦点
(2) afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点

(3) blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

在根控件xml布局文件加 Android:descendantFocusability=”” 加入前两种一个即可解决问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值