EditText.getText().toString() 在使用 ViewModel 设置数据后在 onCreate() 处为空
EditText.getText().toString() is Empty at onCreate() after setting data with ViewModel
当我从另一个 activity 回到 activity 时,我想专注于 editText
的末尾。
我通过 viewName
和 Intent
来过滤应该关注哪个视图。
我正在使用 ViewModel
- Data Binding
模型 class 将数据设置为 views
问题
我可以从意图和视图中获取值,但我无法获取文本大小以将光标设置到 editText
中文本的末尾。虽然每个视图都设置了值,但我可以使用这些值查看和执行其他操作。唯一的问题是开头 getText().toString()
最后设置焦点。
bindingName.viewName.getText().toString()
始终为空,因此光标停留在开头。
如果我在 onCreate() 或 onResume() 状态下调用 requestFocus
,就会出现此问题。但是如果我把它放到稍后执行的某个方法中,效果很好。
Java Step1.class
public class Step1 extends Activity implements AdapterView.OnItemSelectedListener, View.OnClickListener {
Step1Binding step1Binding;
....
SubmittedModel submittedModel;
boolean isTerritorySet = false;
boolean isCeNameSet = false;
boolean isDistributorSet = false;
boolean isPSRSet = false;
boolean isInEditMode = false;
String viewName;
private ArrayList<ArrayList<String>> areaList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
step1Binding = DataBindingUtil.setContentView(this, R.layout.layout_step1);
.....
submittedModel = new SubmittedModel();
submittedModel.setUser_id(UserInfo.getInstance().getUserInfo(this).getUserId());
.....
if (getIntent().hasExtra("value")) {
submittedModel = (SubmittedModel) getIntent().getSerializableExtra("value");
step1Binding.setSubmitData(submittedModel);
}
if (getIntent().hasExtra("edit")) {
isInEditMode = getIntent().getBooleanExtra("edit", false);
if (isInEditMode) {
step1Binding.backBtn.setVisibility(View.VISIBLE);
}
}
if (getIntent().hasExtra("viewName")){
viewName =getIntent().getStringExtra("viewName");
requestFocusOnSelectedView(); //Method to select views
}
.....
}
.......
void requestFocusOnSelectedView() {
//request focus
if (isInEditMode & viewName != null) {
switch (viewName) {
case ViewName.territory:
step1Binding.territoryList.requestFocus();
break;
case ViewName.ceName:
step1Binding.ceNameList.requestFocus();
break;
case ViewName.distributor:
step1Binding.distributorList.requestFocus();
break;
case ViewName.psr:
step1Binding.psrNameList.requestFocus();
break;
case ViewName.subRoute:
step1Binding.subRoute.requestFocus();
step1Binding.subRoute.setSelection(step1Binding.subRoute.getText().length());
break;
case ViewName.outlet:
step1Binding.outletName.requestFocus();
step1Binding.outletName.setSelection(step1Binding.outletName.getText().length());
break;
case ViewName.retailerName:
step1Binding.retailerName.requestFocus();
step1Binding.retailerName.setSelection(step1Binding.retailerName.getText().length());
break;
case ViewName.retailerMobile:
step1Binding.retailerMobile.requestFocus();
step1Binding.retailerMobile.setSelection(step1Binding.retailerMobile.getText().length());
break;
case ViewName.address:
step1Binding.address.requestFocus();
step1Binding.address.setSelection(step1Binding.address.getText().length());
break;
}
}
}
}
XML + DATA Model : Code works fine
试试这个:
view.post(new Runnable() {
public void run() {
theView2Focus.requestFocus();
}
});
您的问题是您必须等到 UI 创建完成。这正是您检测到的。
设置所有数据后,请求焦点之前,调用
binding.executePendingBindings();
这将强制设置视图值。
当我从另一个 activity 回到 activity 时,我想专注于 editText
的末尾。
我通过 viewName
和 Intent
来过滤应该关注哪个视图。
我正在使用 ViewModel
- Data Binding
模型 class 将数据设置为 views
问题
我可以从意图和视图中获取值,但我无法获取文本大小以将光标设置到 editText
中文本的末尾。虽然每个视图都设置了值,但我可以使用这些值查看和执行其他操作。唯一的问题是开头 getText().toString()
最后设置焦点。
bindingName.viewName.getText().toString()
始终为空,因此光标停留在开头。
如果我在 onCreate() 或 onResume() 状态下调用 requestFocus
,就会出现此问题。但是如果我把它放到稍后执行的某个方法中,效果很好。
Java Step1.class
public class Step1 extends Activity implements AdapterView.OnItemSelectedListener, View.OnClickListener {
Step1Binding step1Binding;
....
SubmittedModel submittedModel;
boolean isTerritorySet = false;
boolean isCeNameSet = false;
boolean isDistributorSet = false;
boolean isPSRSet = false;
boolean isInEditMode = false;
String viewName;
private ArrayList<ArrayList<String>> areaList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
step1Binding = DataBindingUtil.setContentView(this, R.layout.layout_step1);
.....
submittedModel = new SubmittedModel();
submittedModel.setUser_id(UserInfo.getInstance().getUserInfo(this).getUserId());
.....
if (getIntent().hasExtra("value")) {
submittedModel = (SubmittedModel) getIntent().getSerializableExtra("value");
step1Binding.setSubmitData(submittedModel);
}
if (getIntent().hasExtra("edit")) {
isInEditMode = getIntent().getBooleanExtra("edit", false);
if (isInEditMode) {
step1Binding.backBtn.setVisibility(View.VISIBLE);
}
}
if (getIntent().hasExtra("viewName")){
viewName =getIntent().getStringExtra("viewName");
requestFocusOnSelectedView(); //Method to select views
}
.....
}
.......
void requestFocusOnSelectedView() {
//request focus
if (isInEditMode & viewName != null) {
switch (viewName) {
case ViewName.territory:
step1Binding.territoryList.requestFocus();
break;
case ViewName.ceName:
step1Binding.ceNameList.requestFocus();
break;
case ViewName.distributor:
step1Binding.distributorList.requestFocus();
break;
case ViewName.psr:
step1Binding.psrNameList.requestFocus();
break;
case ViewName.subRoute:
step1Binding.subRoute.requestFocus();
step1Binding.subRoute.setSelection(step1Binding.subRoute.getText().length());
break;
case ViewName.outlet:
step1Binding.outletName.requestFocus();
step1Binding.outletName.setSelection(step1Binding.outletName.getText().length());
break;
case ViewName.retailerName:
step1Binding.retailerName.requestFocus();
step1Binding.retailerName.setSelection(step1Binding.retailerName.getText().length());
break;
case ViewName.retailerMobile:
step1Binding.retailerMobile.requestFocus();
step1Binding.retailerMobile.setSelection(step1Binding.retailerMobile.getText().length());
break;
case ViewName.address:
step1Binding.address.requestFocus();
step1Binding.address.setSelection(step1Binding.address.getText().length());
break;
}
}
}
}
XML + DATA Model : Code works fine
试试这个:
view.post(new Runnable() {
public void run() {
theView2Focus.requestFocus();
}
});
您的问题是您必须等到 UI 创建完成。这正是您检测到的。
设置所有数据后,请求焦点之前,调用
binding.executePendingBindings();
这将强制设置视图值。