2016-05-14 2 views
1

Я не знаю, что на самом деле происходит для моего EditText!редактировать тексты из текстового представления в текст редактирования в android

У меня есть TextView, EdiText и кнопка.

Необходима логика: Устанавливает EditText с содержимым TextView при нажатии кнопки. После нажатия кнопки «Готово» TextView отобразит содержимое EditText.

Это мой код до сих пор:

 speech_text = (TextView) findViewById(R.id.speech); 
     speech_text_edit = (EditText) findViewById(R.id.speech_edit); 
     editBTN= (Button) findViewById(R.id.edit); 
     editBTN.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      speech_text_edit.setText(speech_text.getText().toString()); 
      speech_text.setVisibility(View.GONE); 
      speech_text_edit.setVisibility(View.VISIBLE); 
      //open keyboard 
      InputMethodManager show_imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 
      show_imm.showSoftInput(editBTN, InputMethodManager.SHOW_IMPLICIT); 

      speech_text_edit.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
       @Override 
       public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
         speech_text.setText(speech_text_edit.getText().toString()); 
         speech_text_edit.setVisibility(View.GONE); 
         speech_text.setVisibility(View.VISIBLE); 
         speech_text_edit.setFocusable(false); 

         //close keyboard 
         InputMethodManager hide_imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 
         hide_imm.hideSoftInputFromWindow(editBTN.getWindowToken(), 0); 
        } 
        return true; 
       } 
      }); 
     } 
    }); 

Компоновка Код:

<TextView 
    android:id="@+id/speech" 
    android:layout_width="match_parent" 
    android:layout_height="350dp" 
    android:layout_margin="25dp" android:layout_marginBottom="150dp" 
    android:textSize="25sp" android:textAlignment="inherit" 
    android:background="@drawable/curved_background" 
    android:textIsSelectable="true" 
    android:padding="10dp" android:visibility="visible" 
    /> 

<EditText 
    android:layout_width="match_parent" 
    android:layout_height="350dp" 
    android:id="@+id/speech_edit" 
    android:background="@drawable/curved_background" 
    android:imeActionLabel="actionDone" 
    android:visibility="gone" 
    android:textSize="25sp" 
    android:layout_margin="25dp" android:layout_marginBottom="150dp" 
    android:inputType="textAutoCorrect" 
    android:layout_gravity="top" 
    android:focusable="true"/> 

Мои проблемы являются:

  1. работает только один раз! После этого нет клавиатуры и указателя.
  2. EditText показывает тексты только в одной строке в центре. Зачем?

Благодарим за помощь.

это logCats:

05-14 19:26:45.045 15484-15484/type_helper.maxsoft.com.typehelper 

D/SensorManager: unregisterListener:: Listener= [email protected]15f0c8 
05-14 19:26:45.045 15484-15484/type_helper.maxsoft.com.typehelper D/Sensors: Remain listener = Sending .. normal delay 200ms 
05-14 19:26:45.045 15484-15484/type_helper.maxsoft.com.typehelper I/Sensors: sendDelay --- 200000000 
05-14 19:26:45.045 15484-15484/type_helper.maxsoft.com.typehelper D/SensorManager: JNI - sendDelay 
05-14 19:26:45.045 15484-15484/type_helper.maxsoft.com.typehelper I/SensorManager: Set normal delay = true 
05-14 19:26:45.045 15484-15484/type_helper.maxsoft.com.typehelper D/SensorManager: registerListener :: handle = 0 name= LSM330DLC 3-axis Accelerometer delay= 200000 Listener= [email protected]15de80 
05-14 19:26:45.050 15484-15484/type_helper.maxsoft.com.typehelper W/IInputConnectionWrapper: getExtractedText on inactive InputConnection 
05-14 19:26:45.065 15484-15484/type_helper.maxsoft.com.typehelper W/IInputConnectionWrapper: getCursorCapsMode on inactive InputConnection 
05-14 19:26:45.080 15484-15484/type_helper.maxsoft.com.typehelper W/IInputConnectionWrapper: getSelectedText on inactive InputConnection 
05-14 19:26:45.080 15484-15484/type_helper.maxsoft.com.typehelper W/IInputConnectionWrapper: getTextBeforeCursor on inactive InputConnection 
05-14 19:26:45.080 15484-15484/type_helper.maxsoft.com.typehelper W/IInputConnectionWrapper: getTextAfterCursor on inactive InputConnection 
05-14 19:26:45.100 15484-15484/type_helper.maxsoft.com.typehelper W/IInputConnectionWrapper: getSelectedText on inactive InputConnection 
05-14 19:26:45.100 15484-15484/type_helper.maxsoft.com.typehelper W/IInputConnectionWrapper: setComposingText on inactive InputConnection 
05-14 19:26:45.100 15484-15484/type_helper.maxsoft.com.typehelper W/IInputConnectionWrapper: getExtractedText on inactive InputConnection 
05-14 19:27:01.140 15484-15484/type_helper.maxsoft.com.typehelper D/SensorManager: unregisterListener:: Listener= [email protected]15de80 
05-14 19:27:01.140 15484-15484/type_helper.maxsoft.com.typehelper D/Sensors: Remain listener = Sending .. normal delay 200ms 
05-14 19:27:01.140 15484-15484/type_helper.maxsoft.com.typehelper I/Sensors: sendDelay --- 200000000 
05-14 19:27:01.140 15484-15484/type_helper.maxsoft.com.typehelper D/SensorManager: JNI - sendDelay 
05-14 19:27:01.140 15484-15484/type_helper.maxsoft.com.typehelper I/SensorManager: Set normal delay = true 
+0

Ваш лог-код не имеет ошибок, поэтому я не уверен, что вы пытаетесь показать –

+0

нормально, я объясню еще раз. «Привет» написано в T.V. editBTN. Инопланетянин показать «Hello» с помощью клавиатуры и указателя. Я редактирую его в «Hello world». Сделано нажатие кнопки BTN, T.V. показывает «Hello world». все нормально. теперь время снова нажимаю editBTN. Инопланетянин «Hello world» тоже, но мягкая клавиатура и указатель не отображаются/запускаются. –

+0

'setFocusable (false)' помешает вам снова ввести текст редактирования. – njzk2

ответ

1

TL; DR

TextView#setFocusable(true); 
TextView#requestFocus(); 

Перед тем, как показать клавиатуру.

InputMethodManager#showSoftInput(FOCUSED_VIEW, 0); 

Удалить

TextView.setFocusable(false); 

FOCUSED_VIEW должен быть вашим speed_edit_text! Не кнопка.

Также убедитесь, что следующие атрибуты для вашего EditText установлены для того, чтобы мульти линейного входа:

android:inputType="textAutoCorrect|textMultiLine" 
android:layout_gravity="top" 
android:lines="8" 
android:gravity="top|start" 
android:minLines="6" 
android:maxLines="10" 
android:scrollbars="vertical" 

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

The result

О фокусе

Проблема заключается ваш призыв к TextView#setFocusable(false). Когда вы установите значение false, вы также потеряете фокус для этого элемента. Итак, теперь, когда вы снова показываете его, Android не знает, почему показывать клавиатуру (потому что EditText не отображается автоматически при показе). Поскольку вы скрываете представление, вам действительно не нужно делать его неуправляемым, это GONE, поэтому его нельзя сфокусировать.

  • Запрос фокус для зрения вы хотите изменить, когда вы собираетесь показать клавиатуру (View#requestFocus)
  • Показать клавиатуру для сфокусированного зрения
  • Когда вы закончите, скрыть клавиатуру
  • либо четкий фокус или скрыть элемент с фокусом (что вы делаете) (View#clearFocus)

О InputManager

Вы можете показать клавиатуру с одним из трех значений:

  • 0: это default when you clickEditText
  • 1 (SHOW_IMPLICIT): это не непосредственно по запросу пользователя
  • 2 (SHOW_FORCED) : сила показывать его, пока пользователь «сила» не закрывать

Вы можете скрыть клавиатуру с одним из трех значений:

  • 0: это default when you defocusEditText
  • 1: (HIDE_IMPLICIT): скрыть его, если оно было показано с SHOW_IMPLICIT
  • 2: (HIDE_NOT_ALWAYS): скрыть его не если было показано с SHOW_FORCED

Однако вы можете заставить всех, кого хотите. Если элемент не настраивается, вы не сможете получить автоматическую фокусировку, показывая клавиатуру.

+0

очень хорошо! большое спасибо. но поскольку я использую 'textMultiLine' Done, ключ исчезает! вы предлагаете мне использовать Action mode для Done или сделать другое.(передать тексты из текста редактирования в текст) –

+0

Да. Если вы используете IME Action, сделанное не заменяется, оно скрывается при длинном нажатии клавиши «enter». Я бы посоветовал вам не скрывать кнопку редактирования, но вместо этого измените кнопку редактирования на кнопку «done». В принципе: если редактирование: кнопка редактирования выполнена. Если не редактирование: кнопка редактирования переходит к редактированию. –

+0

Ya. Я предпочитаю также вводить клавишу «Ввод». И сохранит его на моей клавиатуре ... но как насчет завершения редактирования? Должна быть скрыта для сокрытия платы мягкой клавиатуры. Как я могу это сделать, пожалуйста, дайте мне ваши предложения? –

0
boolean bool =false; 

editBTN= (Button) findViewById(R.id.edit); 
editBTN.setOnClickListener(new OnClickListener() { 

    public void onClick(View v) { 
     if (!bool) 
     { 
      speech_text_edit.setText(speech_text.getText().toString()); 
      bool = true; 
     }else 
     { 
      speech_text.setText(speech_text_edit.getText().toString()); 
      bool = false; 
     } 


    } 
}); 
+0

Я не хочу ограничивать номера строк. Я хочу разместить тексты с начала редактирования текста в целом. –

+0

У меня не возникло твоего вопроса. У вас есть 1 Textview, EditText и Button, а затем на кнопке Button вы хотите установить текст Textview в EditText, а затем на втором нажатии кнопки вы снова хотите установить Text of EditText в TextView. Это правильно? –

+0

semi да/no. я имею в виду, что от «второго щелчка» повторяет стратегию - передайте тексты из текстового вида, чтобы снова редактировать текст. но нет мягкой клавиатуры и указателя. –

Смежные вопросы