2013-12-19 54 views
0

我喜歡在我的應用程序中添加控件。控件的特點是它包含多行文本(例如5行)並且不包含滾動條。我將通過下面的例子來解釋。在Android中顯示多行文本的控件

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

如果你添加一個字符串文本視圖將成爲

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

如果你添加文字的另一行會成爲

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

這可能嗎?我GOOGLE了,但找不到解決方案。

+0

好心解釋爲什麼downvoted。 – Riskhan

+0

我認爲這可能是因爲解釋不夠清楚。我仍然無法確定你需要什麼。你可能想重新修改一下。 – Chayemor

+0

@Joy請參閱編輯的問題。 – Riskhan

回答

1

如果您希望它是一個可重複使用的控件,您需要爲此編寫一個自定義視圖,您可以添加文本並在內部移動內部TextView之間的文本。

或者,您可以使用多個TextView並將文本從一個文本複製到另一個文本中,以便添加新行。

該功能不作爲標準包含在內。

1

我不知道爲什麼你可能想要多行沒有滾動條,但如果這是你所需要的,我認爲這可能是一個可能的解決方案。

很明顯,您需要在佈局上完成一些邏輯,因爲我無法想象一個視圖能夠爲您提供此服務而無需對其進行調整。

所以,我想用5個TextViews的一個RelativeLayout(textViews的數量取決於你想要顯示多少行)。

因此,每個TextView中也會包含您的一條線路,這樣,當用戶添加新行,你不得不做的東西沿着這些路線:

if(linesInView == 5) 
    shiftText(); 

addText(); 

這樣shiftText()將負責通過一個循環並將一個textView的文本設置爲另一個(移動它們),以便爲新文本騰出空間。

然後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++; 
     } 
    } 
} 
相關問題