2011-08-04 26 views
5

Có một TextView có kích thước nhất định và bất kỳ khi nào văn bản được đặt thành nó quá dài, tôi muốn đặt lại thành giá trị đặt trước.Tại sao đặt văn bản từ onMeasure không ảnh hưởng đến TextView?

Để thực hiện việc này, tôi ghi đè onMeasure và gọi setText. Tuy nhiên, điều này không ảnh hưởng đến nội dung TextView.

Tôi đang thiếu gì?

EDIT: nếu bạn nghĩ rằng nó nên được thực hiện một cách hoàn toàn khác nhau - vui lòng cảm thấy tự do để đề nghị

Trả lời

4

onMeasure() thường được gọi là trong giai đoạn bố trí. Bên cạnh đó, theo tôi biết onMeasure() là nơi BẠN phải đo lường chế độ xem của bạn. Nó nhận được 2 giá trị là kích thước của cha mẹ của khung nhìn của bạn, có thể là hằng số.

Tại sao bạn không chỉ kiểm tra độ dài của văn bản bạn đang đặt và nếu quá dài chỉ thay thế văn bản bằng văn bản mặc định của bạn?

0

Từ trang tài liệu View.

Đo chế độ xem và nội dung của nó để xác định chiều rộng được đo và chiều cao được đo. Phương pháp này được gọi bởi các biện pháp (int, int) và phải được ghi đè bởi các lớp con để cung cấp chính xác và đo lường hiệu quả nội dung của chúng.

Nếu bạn muốn TextView có chiều rộng hạn chế hoặc gọi chiều cao setMaxWidth()setMaxHeight()setMaxLines() hoặc kiểm tra xem nó manualy và thay đổi là cách bạn thích từ một phương pháp tùy chỉnh

+0

chế độ xem đã được định cấu hình có kích thước không đổi. bây giờ tôi cần phải thay thế văn bản của nó khi nó không phù hợp. – Asahi

+0

nếu là kích thước contant bạn có thể kiểm tra và xem có bao nhiêu biểu đồ có thể phù hợp. Nếu textize exeeds có chiều dài thay thế nó – weakwire

+0

để thay thế tôi đang gọi 'setText' nhưng nó không ảnh hưởng đến TextView - đó là vấn đề – Asahi

0

Trong bạn onMeasure(int,int)

  1. GỌI super(int,int)
  2. Sử dụng getMeasuredWidth()getMeasuredHeight

một cái gì đó như thế này:

void onMeasure(int a, int b){ 
    super(a,b); 
    if(getMeasuredWidth()>bla) 
     setText("default"); 
} 
0

Đây là những gì tôi làm để giảm font chữ trong trường hợp nội dung văn bản là đủ lớn để goto dòng tiếp theo. Vấn đề là khá nhiều sự khác biệt duy nhất trong trường hợp của bạn là bạn muốn thay thế nó bằng một số văn bản mặc định khác.

ViewTreeObserver vto = ((TextView)findViewById(R.id.myTextView)).getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

      @Override 
      public void onGlobalLayout() { 

       if (null != ((TextView)findViewById(R.id.myTextView))) { 
        if (1 < ((TextView)findViewById(R.id.myTextView)).getLineCount()) { 
        ((TextView)findViewById(R.id.myTextView)).setTextSize(TypedValue.COMPLEX_UNIT_PX, 
           ((TextView)findViewById(R.id.myTextView)).getTextSize() - 2); 
        } 
       } 

      } 
}); 

Điều này sẽ tự động xử lý thời lượng của bạn. Bây giờ kích thước văn bản hoặc chiều dài không thể được cố định dựa trên các yếu tố hình thức khác nhau mà nó sẽ thay đổi. Ví dụ một văn bản 20 ký tự trong màn hình 3,2 inch sẽ được quyết định lớn tuy nhiên nó sẽ là quá nhỏ cho màn hình 4,1 inch. Vì vậy, tôi sẽ đề nghị bạn sử dụng số dòng là tham chiếu và nếu văn bản kết thúc tốt đẹp thì bạn có thể giảm phông chữ như tôi làm hoặc thay thế bằng một cái gì đó khác.

0

Đây là ý tưởng của tôi:

Bạn có thể đo các văn bản trivially với .length() nếu chiều dài của nó là lớn hơn giới hạn của bạn mong muốn, hơn cắt đặt chỉ chuỗi con. Nhưng nếu bạn muốn hiển thị toàn bộ văn bản, bạn có thể triển khai onClickListener() trên đó TextView mà ghen tị sẽ hiển thị toàn bộ văn bản là Dialog hoặc bất kỳ thứ gì.

Một cách tiếp cận khác mà tôi nghĩ có thể phù hợp là tạo bố cục khác nhau cho các màn hình mật độ khác nhau và sau đó thêm vào xml android:maxLines="your limit"android:textSize="some value"android:maxLength="@integer/mylimit" (giới hạn và kích thước khác nhau cho mật độ khác nhau). Vì vậy, những gì còn lại là để đo chiều dài và chỉ hiển thị các chuỗi con (hoặc văn bản mặc định)


Cái gì như:

String myText = "bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla"; 
String clickForMore="...Click for more"; 
int limit = myActivity.this.getResources().getInteger(R.integer.limit); //dont forget to declare it in your string.xml 

Hãy tưởng tượng chúng ta có 3 dòng văn bản và chúng tôi chỉ được phép 2 (với tổng giá trị độ dài int limit). Slice của văn bản của chúng tôi phù hợp với bên trong TextView, nhưng nó không được hiển thị hoàn toàn. Chúng tôi cần thông báo cho người dùng rằng có nhiều điều cần đọc ...

myTextView.setVisibility(View.INVISIBLE);// <--- takes the space in the container 
    if(clickForMore.length() < myText.length() && myText.length() > limit)// <--- avoiding negative place and checking if the entire text is inside the box or there are characters leftover. 
    { 
    String temp = myText.substring(0, limit-clickForMore.length());// <-- we cutting space from currently displayed (not original string) to append the `clickForMore` string information. 
    myTextView.setText(temp+clickForMore); 
    myTextView.setVisibility(View.VISIBLE); 
    myTextView.setOnTouchListener(new OnTouchListener() { 

     @Override 
    public boolean onTouch(View v, MotionEvent event) { 
    // display the dialog with full text.... 
    return false; 
       } 

}); //<--- instantiate the click listener 
    } 
    else 
    { 
     //the text fits the box and no need to slice it, just display it straight forward 
    } 

myText.length() > limit - Kiểm tra xem chuỗi có trùng lặp giới hạn hay không. Triển khai .addTextChangeListener() (TextWatcher) và trong phương thức ghi đè afterTextChange() thực hiện tất cả những điều tôi đã đề cập ở trên.

Sau đó, bạn tạo onClickListener() cho số TextView nơi bạn tạo hộp thoại và sau đó hiển thị văn bản của bạn.


Tôi hy vọng bạn tìm thấy ý tưởng này, hợp lý. Nếu bạn cần giải thích thêm những gì tôi đã có trong tâm trí cảm thấy tự do để viết cho tôi.

0

Bạn có thể đăng ký TextWatcher tùy chỉnh với addTextChangedListener (TextWatcher watcher).

Bên trong TextWatcher bạn sẽ ghi đè hàm afterTextChanged(Editable s), giả vờ chiều dài của văn bản và nếu quá dài, hãy đặt lại văn bản mặc định của bạn. EDIT: Tôi không quá chắc chắn về điều này, nhưng đây là lý do tại sao tôi nghĩ rằng giải pháp của bạn với onMeasure không hoạt động: onMeasure được gọi vào giai đoạn bố trí ban đầu, hoặc khi giao diện người dùng cần phải được thay đổi kích thước, vì vậy khi bạn Giao diện người dùng được đặt, nếu bạn thay đổi văn bản giao diện người dùng sau đó và văn bản trở nên quá dài, điều này không ảnh hưởng đến kích thước của TextView và onMeasure không được gọi lại ...

AnyWay better to look để thay đổi văn bản và thực hiện những gì bạn muốn khi vượt quá giới hạn và cho phép Android thực hiện công việc đo TextView bẩn

0

Bạn sẽ muốn triển khai Textwatcher và trong phương thức onTextChanged(...), gọiPhương thức setEms(...) của, sẽ đặt chiều rộng của TextView thành chiều rộng (n m), trong đó n là đầu vào cho setEms(...).

... 
TextView tv = (TextView) findViewById(R.id.my_text_view); 
tv.addTextChangedListener(this); 
... 
@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
    tv.setEms(count); 
} 
Các vấn đề liên quan