Tôi gặp vấn đề tương tự với tình huống tương tự.
Tôi đã phải tạo một bản chiếu mà tôi yêu cầu chiều cao của view
tùy thuộc vào hoạt ảnh. Trong đó view
, là LinearLayout
có thể là chế độ xem con của loại TextView
. Điều đó TextView
là nhiều dòng và số dòng thực sự yêu cầu khác nhau.
Dù tôi đã làm gì, tôi chỉ có chiều cao được đo cho chế độ xem như thể TextView
chỉ có một dòng để lấp đầy. Không có thắc mắc này làm việc tốt mỗi khi văn bản happend là đủ ngắn cho một dòng, nhưng nó không thành công khi văn bản đã được han dài trên đường dây.
Tôi coi câu trả lời này là: https://stackoverflow.com/a/6157820/854396 Nhưng điều đó không hoạt động tốt cho tôi vì tôi không thể truy cập trực tiếp vào số TextView
được nhúng trực tiếp từ đây. (Tôi có thể lặp dù cây quan điểm con mặc dù.)
Có xem xét mã của tôi vì nó làm việc cho bây giờ:
view
là quan điểm cho rằng là để được hoạt hình. Nó là LinearLayout
(Giải pháp cuối cùng sẽ tiết kiệm hơn một chút ở đây) this
là chế độ xem tùy chỉnh chứa view
và thừa kế từ LinearLayout
.
private void expandView(final View view) {
view.setVisibility(View.VISIBLE);
LayoutParams parms = (LayoutParams) view.getLayoutParams();
final int width = this.getWidth() - parms.leftMargin - parms.rightMargin;
view.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
final int targetHeight = view.getMeasuredHeight();
view.getLayoutParams().height = 0;
Animation anim = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime, Transformation trans) {
view.getLayoutParams().height = (int) (targetHeight * interpolatedTime);
view.requestLayout();
}
@Override
public boolean willChangeBounds() {
return true;
}
};
anim.setDuration(ANIMATION_DURATION);
view.startAnimation(anim);
}
Gần như vậy nhưng tôi đã mắc phải một sai lầm khác. Trong phân cấp khung nhìn có hai chế độ xem tùy chỉnh có liên quan là các lớp con của LinearLayout
và xml của chúng được hợp nhất thành một thẻ merge
dưới dạng thẻ gốc xml. Trong một trong các thẻ merge
tôi bỏ qua này để đặt thuộc tính android:orientation
thành vertical
. Điều đó không làm phiền quá nhiều đối với bản thân bố cục, bởi vì trong số ViewGroup
đã hợp nhất này chỉ là một đứa trẻ ViewGroup
và do đó tôi không thể thực sự nhìn thấy sai hướng trên màn hình. Nhưng nó đã ở đó và loại vỡ logic đo lường bố cục này một chút.
Ngoài những điều trên, có thể cần phải loại bỏ tất cả các phần đệm được liên kết với LinearLayout
s và các lớp con trong phân cấp chế độ xem. Thay thế chúng bằng lề, ngay cả khi bạn phải bọc một bố trí khác xung quanh nó để làm cho nó trông giống nhau.
Nguồn
2016-03-23 17:06:16
Thật vậy, chiều cao được trả về bởi getMeasuredSpec là khác nhau. Tại thời điểm này 34 so với 137. Tôi đã chỉnh sửa thông điệp đầu tiên của mình với một số thông tin khác. – anonymous
Xem câu trả lời mới của tôi. – Fixpoint
Câu trả lời này là câu trả lời đúng, nhưng thiếu mã là lý do đơn giản cho ít người trả lời hơn. – Warpzit