2017-01-24 5 views
1

Я хочу сфокусироваться до конца editText, когда я вернусь к активности из другого вида деятельности. I Pass viewName с Intent для фильтрации, который должен быть сфокусирован. Я использую ViewModel - Data Binding класс модели для установки данных в задачу viewsEditText.getText(). ToString() пуст at onCreate() после установки данных с помощью ViewModel

я могу получить значение от намерения и зрения также сосредоточено, но я не могу получить размер текста, чтобы установить курсор в конец текста в editText. Хотя значения заданы для каждого представления, я могу видеть и делать другие вещи со значениями. Только проблема getText().toString() в начале, чтобы установить фокус, наконец.

bindingName.viewName.getText().toString() всегда пуст, поэтому курсор остается в начале.

Эта проблема возникает, если я вызываю requestFocus в состоянии onCreate() или onResume(). но отлично работает, если поместить это в какой-то метод, который выполняется немного позже.

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 Модель: Код работает отлично

ответ

2

После установки всех ваших данных, но перед запросом фокус, вызовите

binding.executePendingBindings(); 

Это заставит Просмотр значений, которые будут установлены.

+0

намного более чистый подход! благодаря –

1

Попробуйте это:

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

Ваша проблема в том, что вы должен подождать пока пользовательский интерфейс не будет создан. Это именно то, что вы обнаружили.

+0

Я не получил, какой должен быть 'view'? –

+1

Попробуйте 'step1Binding.getRoot()' – beeb

+0

спасибо! работал как шарм –