【问题标题】:EditText.getText().toString() is Empty at onCreate() after setting data with ViewModel使用 ViewModel 设置数据后,EditText.getText().toString() 在 onCreate() 处为空
【发布时间】:2017-06-09 02:42:36
【问题描述】:

当我从另一个活动回到活动时,我想专注于 editText 的末尾。 我通过viewNameIntent 来过滤应该关注哪个视图。 我正在使用ViewModel - Data Binding 模型类将数据设置为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 模型:代码运行良好

【问题讨论】:

    标签: java android mvvm data-binding android-databinding


    【解决方案1】:

    试试这个:

    view.post(new Runnable() {
        public void run() {
            theView2Focus.requestFocus();
        }
    });
    

    您的问题是您必须等到创建 UI。这正是您检测到的。

    【讨论】:

    • 我没明白应该是view 吗?
    • 试试step1Binding.getRoot()
    【解决方案2】:

    设置所有数据后,但在请求焦点之前,调用

    binding.executePendingBindings();
    

    这将强制设置视图值。

    【讨论】:

      猜你喜欢
      • 2017-06-07
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多