Cách thay đổi lề của TextView


82

Tôi đã thêm TextView có lập trình vào LinearLayout và trên một số sự kiện bên ngoài, tôi muốn giảm lề dưới của TextView đó xuống -10, tôi đã thử làm theo.

LinearLayout.LayoutParams lastTxtParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lastTxtParams.setMargins(0, 0, 0, -10);
mOldTextView.setLayoutParams(lastTxtParams);
mOldTextView.invalidate();

Cách sửa đổi Lề của tiện ích con đã được thêm vào Chế độ xem có đúng cách không?
Một số cách nó không hoạt động.

Câu trả lời:


187
TextView forgot_pswrd = (TextView) findViewById(R.id.ForgotPasswordText);
forgot_pswrd.setOnTouchListener(this);     
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
llp.setMargins(50, 0, 0, 0); // llp.setMargins(left, top, right, bottom);
forgot_pswrd.setLayoutParams(llp);

Tôi đã làm điều này và nó hoạt động hoàn hảo. Có thể vì bạn đang cung cấp giá trị trong -ve, đó là lý do tại sao mã của bạn không hoạt động. Bạn chỉ cần đặt mã này nơi bạn đang tạo tham chiếu của chế độ xem.


Cuộc gọi này yêu cầu API cấp 19.
Sanjay Kumar

4
@SanjayKumar - Không, không có ràng buộc mà nó đòi hỏi mức API 19
Debarati

1
Làm thế nào để trả lời câu hỏi của OP? Có vẻ như mã giống nhau ngoại trừ trình nghe cảm ứng thiết lập dòng dư thừa, không gọi validate () và không nêu rõ ràng các đối số trong hàm tạo đối với LinearLayout.LayoutParams [LayoutParams.WRAP_CONTENT vs LinearLayout.LayoutParams.WRAP_CONTENT]? Ngoài ra (không có vấn đề gì), OP đang yêu cầu đặt lề trên TextView được tạo lập trình, mặc dù câu trả lời nhận được TextView từ layout xml, thông qua findViewById (). Tôi rất tò mò những gì tôi đang mất tích ở đây ...
Melquiades

@Melquiades đồng ý với bạn, loại bỏ dưới dạng câu trả lời đã chọn vì nó không trả lời câu hỏi, cũng như đã đề cập trong câu trả lời Maybe as you are giving the value in -vebiên có thể là giá trị -ve.
Người dùng7723337

61

Bố cục của bạn trong xml có thể đã có thuộc tính layout_margin (Left | Right | etc) trong đó, có nghĩa là bạn cần truy cập đối tượng được tạo bởi xml đó và sửa đổi nó.

Tôi thấy giải pháp này rất đơn giản:

ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) mTextView
        .getLayoutParams();

mlp.setMargins(adjustmentPxs, 0, 0, 0);

break;

Lấy bản sao LayoutParams của chế độ xem văn bản của bạn, truyền nó xuống MarginLayoutParams và sử dụng phương thức setMargins để đặt lề.


Điều này cho phép tôi ClassCastException: -> ViewGroup.LayoutParams không thể cast để ViewGroup.MarginLayoutParams
Harshil Pansare

10

Đây là một vấn đề phức tạp, tôi đặt lề thành textview trong một hàng của bố cục bảng. xem bên dưới:

TableLayout tl = new TableLayout(this);
tl.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

TableRow tr = new TableRow(this);        
tr.setBackgroundResource(R.color.rowColor);

LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.setMargins(4, 4, 4, 4);

TextView tv = new TextView(this);
tv.setBackgroundResource(R.color.textviewColor);
tv.setText("hello");
tr.addView(tv, params);

TextView tv2 = new TextView(this);
tv2.setBackgroundResource(R.color.textviewColor);
tv2.setText("hi");
tr.addView(tv2, params);

tl.addView(tr);
setContentView(tl);

lớp cần nhập cho LayoutParams để sử dụng trong một hàng bảng là:

import android.widget.**TableRow**.LayoutParams;

điều quan trọng cần lưu ý là tôi đã thêm lớp cho hàng bảng. tương tự, nhiều lớp khác có sẵn để sử dụng LayoutParams như:

import android.widget.**RelativeLayout**.LayoutParams;

nhập android.widget. LinearLayout .LayoutParams;

vì vậy sử dụng cho phù hợp.


5

setMargins () đặt lề INNER của TextView, không đặt lề bố cục. Có phải đó là những gì bạn muốn làm gì? Hai biên độ khác nhau này có thể khá phức tạp.

Nếu bạn muốn đặt lề bố cục, hãy thay đổi LayoutParams của TextView (textview.getLayoutParams (), sau đó thay đổi các tham số trên đối tượng LayoutParams được trả về).

Bạn không cần thay đổi bất kỳ điều gì trên LinearLayout của mình.

Trân trọng, Oliver


3

TextView không hỗ trợ setMargins. Tài liệu Android nói:

Mặc dù một dạng xem có thể xác định vùng đệm, nhưng nó không cung cấp bất kỳ hỗ trợ nào cho các lề. Tuy nhiên, các nhóm xem cung cấp một sự hỗ trợ như vậy. Tham khảo ViewGroup và ViewGroup.MarginLayoutParams để biết thêm thông tin.


1

Đây là một cách tiếp cận khác ...

Khi tôi gặp phải vấn đề tương tự, tôi không thích các giải pháp được đề xuất ở đây. Vì vậy, tôi đã nghĩ ra một cách khác: Tôi đã chèn một TextView trong tệp XML giữa hai trường mà tôi muốn phân tách bằng hai trường quan trọng:

  1. khả năng hiển thị được đặt thành "GONE" (không chiếm bất kỳ dung lượng nào ..)
  2. chiều cao được đặt thành bất kỳ giá trị nào tôi cần sự tách biệt.

    XML:
    ...//some view up here
    <TextView
        android:id="@+id/dialogSeparator"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:visibility="gone"/>
    ...//some view down here
    

Bây giờ, tôi viết mã, tất cả những gì tôi cần làm đơn giản là thay đổi khả năng hiển thị thành vô hình (nghĩa là nó ở đó và chiếm không gian cần thiết, nhưng nó không nhìn thấy)

    JAVA:

    TextView tvSeparator = (TextView)activity.findViewById(R.id.dialogSeparator);
    tvSeparator.setVisibility(View.INVISIBLE);
    //Inside an activity extended class I can use 'this' instead of 'activity'.

Viola ... Tôi đã nhận được số tiền cần thiết. BTW, Giải pháp này dành cho LinearLayout với hướng dọc, nhưng bạn có thể thực hiện với các bố cục khác nhau.

Hi vọng điêu nay co ich.


0

Có thể bạn đã thay đổi lề bố cục sau khi nó được vẽ. mOldTextView.invalidate () là vô ích. bạn cần gọi requestLayout () trên cha để chuyển tiếp cấu hình mới. Khi bạn di chuyển mã thay đổi bố cục trước khi bản vẽ diễn ra, mọi thứ đều hoạt động tốt.


0
        TextView tv = (TextView)findViewById(R.id.item_title));
        RelativeLayout.LayoutParams mRelativelp = (RelativeLayout.LayoutParams) tv
                    .getLayoutParams();
        mRelativelp.setMargins(DptoPxConvertion(15), 0, DptoPxConvertion (15), 0);
        tv.setLayoutParams(mRelativelp);

    private int DptoPxConvertion(int dpValue)
    {
       return (int)((dpValue * mContext.getResources().getDisplayMetrics().density) + 0.5);
    }

getLayoutParams () của textview nên được truyền đến các Tham số tương ứng dựa trên Gốc của textview trong xml .

<RelativeLayout>
   <TextView
    android:id="@+id/item_title">
</RelativeLayout>

Để hiển thị cùng một kích thước thực trên các thiết bị khác nhau, hãy sử dụng phương thức DptoPxConvertion () mà tôi đã sử dụng ở trên. Các tham số setMargin (left, top, right, bottom) sẽ nhận các giá trị trong pixel không phải trong dp . Để tham khảo thêm, hãy xem Câu trả lời liên kết này

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.