Android中的UI注意点

UI问题

1. RecyclerView被软键盘挤兑解决

  1. 对于RecyclerView中调用notifyItemRangeChanged(Int,Int)刷新局部数据项出现问题的解析
    方法解释:notifyItemRangeChanged(first,count)------->刷新从当前item起,数量为count个的子项(每个子项重新调用onBindViewHolder()去更新显示。)。注意:他会包含当前的这一条,所以刷新全局的话,记得算上开始的那一个。
    正常流程:调用了对应的方法findFirstVisibleItemPosition()寻找当前界面中第一个可见的子项,并返回其position,同时调用findLastVisibleItemPosition()寻找当前界面最后一个可见子项并返回其position,(注意这两个方法只可以用RecyclerView.layoutManager调用,同时这时候的layoutManager必须为LinearLayoutManager)然后,传参进入对应的notifyItemRangeChanged,此时会根据传入进来的消息更新对应的子项。
    问题:在响应输入字段,并输入字段查询后更新RecyclerView中的内容时出现无法全部更新想要的字段。
    对应原因:因为当点击对应项进行数据输入的时候,会调用软键盘,此时会挤压当前的RecyclerView,导致得到的值不正确,当软键盘下去后,对应的更新就非常奇怪。
    解决方法:在持有本RecyclerView的Activity中添加一条语句如下: android:windowSoftInputMode="stateHidden|adjustPan,对应的放置如下。
    <activity
            android:name=".ui.MainActivity"
            android:exported="true"
            
            android:windowSoftInputMode="stateHidden|adjustPan"><!-- 用于软件挤兑fragment的处理-->
            
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    

2. 数据绑定问题—editView的setSelection失效

情景描述:editView的text是和对应的ViewModel中的字段绑定的,同时,当其他页面来到这里时,通过bundle传输对应的数据并填充到editView中,并设置setSelection()设置光标位置。
问题描述:传输后可以将数据放置到对应的editView中,但是设置了光标却失效。
错误的逻辑

  1. 数据双向绑定
// xml定义
<EditText
           android:id="@+id/et_typed_email"
           .............
           android:text="@={viewModel.email}"
           .............. />



// View Model中的字段
val email = ObservableField("")
  1. viewModel中字段更新--------更新逻辑(这是错误的)
// 无法更新光标位置
try {
           intent?.extras?.getString(EMAIL)?.let {
               if (it.isNotEmpty()) {
                   viewModel.email.set(it)
               }
               // 设置点击后的指针位置
               et_typed_email.setSelection(it.length)
               println("设置的光标位置-----------------${it.length}")
               et_typed_email.requestFocus()
           }
       } catch (e: Exception) {
           e.printStackTrace()
       }



// UI接收到了数据,但是无法刷新显示出来
try {
           intent?.extras?.getString(EMAIL)?.let {
               if (it.isNotEmpty()) {
                  et_typed_email.setText(it)
               }
               // 设置点击后的指针位置
               et_typed_email.setSelection(it.length)
               println("设置的光标位置-----------------${it.length}")
               et_typed_email.requestFocus()
           }
       } catch (e: Exception) {
           e.printStackTrace()
       }
  1. 打印出的问题
// 光标无法更新的打印
设置的光标位置-----------------0

// UI无数据的打印
设置的光标位置-----------------15

纠正:虽然是双向绑定,确实可以将数据显示到对应的UI上,但是此时去打印对应editView的内容的时候会发现,他为空,即数据虽然刷新到UI上了,但是不是UI的数据,还应该为UI设置一份(PS:由于editView的text属性和View Model中的字段绑定了,所以如果只为editView设置字段,而不更新view Model中的内容,UI上就不会有内容,所以要同时设置。)

// 正确处理
try {
           intent?.extras?.getString(EMAIL)?.let {
               if (it.isNotEmpty()) {
                   viewModel.email.set(it)
                   et_typed_email.setText(it)
               }
               // 设置点击后的指针位置
               et_typed_email.setSelection(it.length)
               et_typed_email.requestFocus()
           }
       } catch (e: Exception) {
           e.printStackTrace()
       }

内层原因:
现在还不知道。。。。。先欠着

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值