Сделать следующий EditText появится на экране при следующем щелчке действия - PullRequest
1 голос
/ 20 марта 2019

У меня есть несколько EditTexts на моем экране, и все они построены следующим образом.

XML:

<android.support.design.widget.TextInputEditText
            android:id="@+id/textInputEditText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/name"
            app:fontFamily="@font/karla"
            android:inputType="textMultiLine|textCapCharacters"
            android:maxLength="12"
            android:textColor="#5C7264"
            />

Код:

private void addItemsToLinearLayout(int numItems) {

 LayoutInflater inflater = LayoutInflater.from(mContext);

     for (int i = 0; i < numItems; i++) {

         View childView = inflater.inflate(R.layout.item_linearlayout, null);        

         linearlayoutPlayersNames.addView(childView);            

         ImageView deleteRowIcon = childView.findViewById(R.id.deleteRowIcon);     
         deleteRowIcon.setOnClickListener(this);

         TextView myTV = childView.findViewById(R.id.txtTitle);          
         myTV.setText(String.format(getString(R.string.player), linearlayoutPlayersNames.indexOfChild(childView) + 1));         


         EditText editText = childView.findViewById(R.id.textInputEditText);
         editText.setImeOptions(EditorInfo.IME_ACTION_NEXT);
         editText.setRawInputType(InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);

    }
}

Когда янажмите следующую кнопку программной клавиатуры, чтобы перейти к следующему EditText, как и ожидалось, но ТОЛЬКО если следующий EditText виден на экране.Когда следующий EditText не отображается на экране, следующее действие не имеет никакого эффекта, и, кроме того, оно заменяет кнопку следующего действия на кнопку действия возврата каретки, как показано в этом видео: https://imgur.com/a/snAbdmU

ЧтоЯ намереваюсь сделать, это нажать следующую кнопку и переместить видимость к следующему тексту редактирования.

ОБНОВЛЕНИЕ : некоторые из вас сказали мне сделать это, используя android:nextFocusDown или программно с editText.setNextFocusForwardId(editTextSecond.getId()); но я не могу, потому что я использую цикл для создания EditText s, как показано сейчас в коде.

Ответы [ 3 ]

0 голосов
/ 20 марта 2019

Да, вам нужно удалить textMultiLine из android:inputType, тогда он будет работать в обоих случаях, следующий EditText видим и не виден.

<android.support.design.widget.TextInputEditText
        android:id="@+id/textInputEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/name"
        app:fontFamily="@font/karla"
        android:inputType="textCapCharacters"
        android:maxLength="12"
        android:textColor="#5C7264"
        />
0 голосов
/ 20 марта 2019

Как вы упомянули, вы делаете это программно, а не в XML, используя

android:nextFocusDown="@id/textInputEditTextSecond"

Вы можете использовать его программно, как это

editText.setNextFocusForwardId(editTextSecond.getId());

и добавьте editText.setImeOptions(EditorInfo.IME_ACTION_NEXT); для всех EditText

Внутри для setId цикла каждого EditText, а затем установите nextForward, как показано ниже

private void addItemsToLinearLayout(int numItems) {

 LayoutInflater inflater = LayoutInflater.from(mContext);

     for (int i = 0; i < numItems; i++) {

         View childView = inflater.inflate(R.layout.item_linearlayout, null);        

         linearlayoutPlayersNames.addView(childView);            

         ImageView deleteRowIcon = childView.findViewById(R.id.deleteRowIcon);     
         deleteRowIcon.setOnClickListener(this);

         TextView myTV = childView.findViewById(R.id.txtTitle);          
         myTV.setText(String.format(getString(R.string.player), linearlayoutPlayersNames.indexOfChild(childView) + 1));         


         EditText editText = childView.findViewById(R.id.textInputEditText);
         editText.setImeOptions(EditorInfo.IME_ACTION_NEXT);
         editText.setRawInputType(InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);

         // setId of each EditText and then set nextForward as
         editText.setId(i);
         editText.setNextFocusForwardId(i+1);

    }
}
0 голосов
/ 20 марта 2019

Сделайте это:

  EditText editText2 = childView.findViewById(R.id.textInputEditText);
  EditText editText = childView.findViewById(R.id.textInputEditText);
  editText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            boolean handled = false;
            if (actionId == EditorInfo.IME_ACTION_DONE) {
        editText2.setVisibility(View.VISIBLE);
        editText2.setImeOptions(EditorInfo.IME_ACTION_NEXT);
        editText2.setRawInputType(InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
              return handled;
             }
        }
    });

  editText2.setOnEditorActionListener(new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            boolean handled = false;
            if (actionId == EditorInfo.IME_ACTION_DONE) {
               // do same for others to    
            return handled;  
             }

        }
    });
...