2013-12-19 3 views
0

Мне нравится добавлять элемент управления в мое приложение. Особенностью элемента управления является наличие нескольких строк текста (например, 5 строк) и не содержит полосы прокрутки. Я объясню нижеприведенный пример.Элемент управления, который отображает несколько строк текста в android

|-----------------| 
| text1   | 
| text2   | 
| text3   | 
| text4   | 
|     | 
|-----------------| 

если добавить строку к тексту просмотра он стал

|-----------------| 
| text1   | 
| text2   | 
| text3   | 
| text4   | 
| text5   | 
|-----------------| 

если добавить еще одну строку текста, то он будет стал

|-----------------| 
| text2   | 
| text3   | 
| text4   | 
| text5   | 
| text6   | 
|-----------------| 

Возможно ли это? Я googled, но не смог найти решение.

+0

любезно объясняет, почему downvoted. – Riskhan

+0

Я думаю, что это могло быть потому, что объяснение недостаточно ясное. Я для одного все еще не могу определить, что вам нужно. Вы можете немного перефразировать его. – Chayemor

+0

@Joy Пожалуйста, просмотрите отредактированный вопрос. – Riskhan

ответ

1

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

В качестве альтернативы вы можете просто использовать несколько TextViews и скопировать текст из одного в другое, если хотите добавить новую строку.

Функциональность не включена в стандартную комплектацию.

1

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

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

Итак, я думаю, что RelativeLayout с 5 TextViews (количество текстовых просмотров зависит от количества строк, которые вы хотите показать).

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

if(linesInView == 5) 
    shiftText(); 

addText(); 

, так что shiftText() будет отвечать прохождение цикла и установка текста одного текстового файла в другое (смещение их), чтобы освободить место для нового текста.

Тогда addText() просто добавит новый текст, созданный пользователем, в свободную точку, созданную с помощью shiftText().

В целом вы можете следовать этим рекомендациям. Имейте в виду, что я только что написал этот код из головы, у меня нет средств для проверки его правильности на данный момент. Кроме того, это первая попытка, есть место для совершенствования:

private static int MAX_NUM_LINES = 5; 
private int linesShown = 0; 
private ArrayList<TextView> views = new ArrayList<>(); 
private EditText userInput; 

public void onCreate(...){ 
    .... 
    views.add((TextView)findViewById(R.id.firstline); 
    views.add((TextView)findViewById(R.id.secondline); 
    views.add((TextView)findViewById(R.id.thirdline); 
    views.add((TextView)findViewById(R.id.fourthline); 
    views.add((TextView)findViewById(R.id.fifthline); 

    this.userInput = (EditText) findViewById(R.id.input); 
    //I suggest these in order to avoid calling "findViewById()" everytime the user 
// adds a new sentences, which I gather will happen often 
} 

public void someEventCalledWhenUserAddsNewLine(View view){ 
    if(this.linesShown>=MAX_NUM_LINES) 
      shiftText(); 

    addNewLine();   
} 

    private void shiftText(){ 
     //Shift your text by looping through your this.views 
     for(pos=0; pos<this.views.size()-1; ++pos){ 
      String nextLine = this.views.get(pos+1).getText(); 
      this.views.get(pos).setText(nextLine); 
     } 
     //You need to set the condition to this.views.size()-1 because 
     //when you reach position 4 (your last TextView) you have to sop 
     // since there is not text to shift to that one 
     this.views.get(this.views.size()-1).setText(null); 
     //Make sure you set the text of the last TextView to null so that 
     // addLine() will be able to find the first available TextView 
    } 

    private void addNewLine(){ 
     //Add text from this.userInput to the first available TextView in this.views 
     int pos; 
     for(pos=0; pos<this.views.size(); ++pos){ 
      if(this.views.get(pos).getText()==null){ 
       //We have found the first available TextView 
        break; 
      } 
     } 
     this.views.get(pos).setText(this.userInput.getText()); 
     //Pos holds the position of the first available TextView, now we have 
     // added the new line 
    this.linesShown++;   
    } 

Начало улучшения летучей мыши будет просто следить за индексом первого доступного TextView так что вам не придется возиться с петлей в addLine() ищет его.

+1

OP не хочет прокрутки, потому что он хочет видеть только последние 5 строк текста. В противном случае это то, что я уже сказал в своем ответе. – Kuffs

+0

спасибо за ваши усилия – Riskhan

1

Нечто подобное должно работать я думаю, но я сомневаюсь, что это оптимальный:

public class LinesTextView { 
    private TextView tv; 
    private int linesCount = 0; 
    private int maxLines = 5; 
    public LinesTextView(TextView tv){ 
     this.tv = tv; 
    } 
    public void addLine(String line){ 
     if(linesCount == maxLines){ 
      String lines = tv.getText().toString(); 
      int pos = lines.indexOf("\n"); 
      StringBuffer buff = new StringBuffer(lines.substring(pos+1)); 
      buff.append('\n'); 
      buff.append(line); 
      tv.setText(buff.toString()); 
     } else if(linesCount == 0){ 
      tv.setText(line); 
      linesCount = 1; 
     } else { 
      StringBuffer buff = new StringBuffer(tv.getText().toString()); 
      buff.append('\n'); 
      buff.append(line); 
      tv.setText(buff.toString()); 
      linesCount++; 
     } 
    } 
} 
Смежные вопросы