2012-05-16 3 views
6

Я знаю, что в Stackoverflow есть много связанных вопросов, но я попытался сделать все, что написано в любом из них, и до сих пор я не мог заставить это работать.EditText не будет обертывать текст

Моя проблема проста. У меня есть приложение для Android, и у меня есть поле, где пользователь будет вводить текст. Однако я не хочу, чтобы этот текст был многострочным (он не должен иметь «\ n» в нем), но я хочу, чтобы он был завершен, если размер строки больше, чем область просмотра. Таким образом, в основном, то, что я хочу, такое же поведение, что и текстовое поле в поле Gmail Subject.

Это все мое мнение:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical"> 

<TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/question" 
     android:textAppearance="@style/titleFont"/> 

<EditText 
    android:id="@+id/edit_question_value" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="0.3" 
    android:gravity="top" 
    android:inputType="textImeMultiLine|textEmailSubject" 
    android:maxLength="70" 
     > 

</EditText> 

<TextView 
     android:id="@+id/textView2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/answer" 
     android:textAppearance="@style/titleFont"/> 

<EditText 
     android:id="@+id/edit_question_answer" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:gravity="top" 
     android:layout_weight="0.7" 
     android:inputType="textMultiLine"/> 

<LinearLayout 
     android:id="@+id/linearLayout1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal"> 

    <Button 
      android:id="@+id/save_question" 
      android:layout_width="120dp" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:layout_weight="0.5" 
      android:text="@string/save"/> 

    <Button 
      android:id="@+id/cancel_edit_question" 
      android:layout_width="120dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.5" 
      android:text="@string/cancel"/> 
</LinearLayout> 

текст Я хочу, чтобы это поведение является TheOne с идентификатором равен @ + ид/edit_question_value. До сих пор я мог либо сделать его по-настоящему многострочным (так что пользователь может ввести ввод, если он захочет) или однострочный, и текст не будет завершен. Возможно, некоторые элементы вокруг текста имеют некоторые помехи, и именно поэтому я включил весь взгляд.

Кто-нибудь знает, что происходит?

ответ

8

Это то, что раньше беспокоило людей, и я мог найти ответ, когда мне это нужно. В чистом XML, то есть. Если мы сможем использовать программирование, а не только разметку, мы можем сделать это с небольшим взломом, если можете. В основном мы объявляем multiLine editText, а затем ловим ключ возврата, чтобы избежать новых строк.

Первое заявление в XML:

<EditText 
    android:id="@+id/noReturnEditText" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:imeOptions="actionDone" 
    android:inputType="textMultiLine|textCapSentences" 
    android:text="lorem ipsum \n dolor site amet helping stackoverflow" /> 

Да, я знаю, что ты думаешь «Но эй, Хуан это multiliner EditText, и я хочу один лайнер, как на эту тему области gmail ". Я знаю, я знаю, но мы собираемся позаботиться об этом прямо сейчас, удалив поведение многострочной части, которую мы не хотим, сохраняя при этом текстовую упаковку do.

Теперь остальная часть кода:

EditText noReturnEditText = (EditText) findViewById(R.id.noReturnEditText); 
     noReturnEditText.setOnKeyListener(new OnKeyListener(){ 
      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 
       if (keyCode == KeyEvent.KEYCODE_ENTER) return true; 
       return false; 
      } 
     }); 

Вы, вероятно, может прочитать код довольно легко, но в случае, если кто-то нуждается в объяснении, мы Установка OnKeyListener к EditText мы хотим быть " oneline-multilinelike ", и если пользователь нажимает клавишу возврата (KEYCODE_ENTER), мы сообщаем событию не распространяться, возвращая true, который в этом контексте означает, что мы обработали событие.

Результат:

enter image description here

Соображения

Нажатие клавиши возврата не единственный способ ввода новой строки. Пользователь может скопировать/вставить некоторый текст и в итоге получить многострочную запись в однострочном EditText. Не беспокойтесь!Мы можем лишить значение, прежде чем хранить или использовать его с чем-то вроде

myData = rawText.replace(System.getProperty("line.separator"), " ");

Что делать, если у меня есть много EditText взглядов?

Ну, у вас в основном есть два варианта. Сделайте это один за другим и вытащите глаза или сделайте что-нибудь подобное, его список просмотров и циклов для каждого вида.

//Declare the reusable listener 
    OnKeyListener myListener = new OnKeyListener(){ 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (keyCode == KeyEvent.KEYCODE_ENTER) return true; 
      return false; 
     } 
    } 
//Loop through the views 
    int viewIds[] = {R.id.edittext1,R.id.edittext2,R.id.edittext3,R.id.edittext4}; 
    for(int id : viewIds) ((EditText)findViewById).setOnKeyListener(myListener); 
Смежные вопросы