Thêm phần đệm vào chế độ xem theo chương trình


235

Tôi đang phát triển ứng dụng Android v2.2.

Tôi có một mảnh .

Trong cuộc onCreateView(...)gọi lại của lớp phân đoạn của tôi, tôi thổi phồng một bố cục đến đoạn như sau:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.login, null);

    return view;
}

Tệp bố cục bị thổi phồng ở trên là (login.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
 >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Username" />


    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Username" />

</LinearLayout>

Tôi muốn đặt thành phần tử paddingTopở trên <LinearLayout>và tôi muốn làm điều đó trong Java mã thay vì làm điều đó trong xml.

Làm thế nào để thiết lập paddingTopđể <LinearLayout>trong đoạn mã lớp Java của tôi ??


2
Bạn sẽ cần gán ID cho linearLayout của mình để bạn có thể tìm thấy nó findViewByIdvà sau đó gọi setPaddingnó.
Aleks G

@AleksG Nói chung là có, nhưng được cho rằng linearLayout là thành phần gốc của chữ tượng hình bị thổi phồng không cần thiết ở đây. viewđã là linearLayout, không cần tìm lại trong trường hợp này. Cho rằng đây là một trong những đặc biệt mặc dù.

1
@alextsc: vâng, đồng ý. Tuy nhiên, tôi vẫn thích gán ID cho bất cứ điều gì tôi có thể đề cập đến trong ứng dụng.
Aleks G

Câu trả lời:


485

view.setPadding(0,padding,0,0);

Điều này sẽ đặt phần đệm hàng đầu thành padding-pixels.

Nếu bạn muốn đặt nó dpthay vào đó, bạn có thể thực hiện chuyển đổi :

float scale = getResources().getDisplayMetrics().density;
int dpAsPixels = (int) (sizeInDp*scale + 0.5f);

6
@ Leem.fin như Chris nói, đó là pixel. Nếu bạn muốn dp, bạn sẽ phải thực hiện chuyển đổi theo cách thủ công:float scale = getResources().getDisplayMetrics().density; int size = (int) (sizeInPx*scale + 0.5f);
Jave

7
0,5f đến từ đâu?
Herr von Wurst

11
@Georg Mã đó được lấy từ đây: developer.android.com/guide/practices/ trộm Số 0,5 được sử dụng để lấy số nguyên gần nhất khi truyền (thay vì sử dụng Math.round ())
Jave

Tôi nghĩ rằng các tên biến phải theo cách khác: sizeInDpthực sự là số pixel bạn nhận được khi chuyển đổi sizeInPxdps.
Friederbluemle

98

Để trả lời câu hỏi thứ hai của bạn:

view.setPadding(0,padding,0,0);

như SpK và Jave đã đề xuất, sẽ đặt phần đệm theo pixel. Bạn có thể đặt nó trong dp bằng cách tính giá trị dp như sau:

int paddingDp = 25;
float density = context.getResources().getDisplayMetrics().density
int paddingPixel = (int)(paddingDp * density);
view.setPadding(0,paddingPixel,0,0);

Mong rằng sẽ giúp!


3
Dĩ nhiên điều này sẽ biên dịch và hoạt động như mong đợi, nhưng để rõ ràng, bạn nên chuyển đổi cách đặt tên của các biến int. Bởi vì bạn xác định phần đệm của mình trong DP và tính toán nó sẽ là pixel nào cho thiết bị đã cho này.
Glenn85

Bạn đang chuyển đổi dp sang pixel. Các tên biến là khó hiểu. "paddingPixel" thực sự có nghĩa là dp
Jiechao Wang

92

Nếu bạn lưu trữ phần đệm trong các tệp tài nguyên, bạn chỉ cần gọi

int padding = getResources().getDimensionPixelOffset(R.dimen.padding);

Nó thực hiện việc chuyển đổi cho bạn.



14

Bạn có thể đặt phần đệm cho chế độ xem của mình bằng pro theo ngữ pháp trong suốt đoạn mã bên dưới -

view.setPadding(0,1,20,3);

Và, cũng có loại đệm khác nhau có sẵn -

Đệm

Đệm lót

Đệm lót

PaddingRight

PaddingTop

Những, liên kết sẽ giới thiệu trang web Nhà phát triển Android. Hy vọng điều này sẽ giúp bạn nhiều.


@ Leem.fin Hãy xem cái này bạn sẽ có thể biết sự khác biệt.
Praveenkumar

9

Sử dụng TypedValuelà cách chuyển đổi thành pixel gọn gàng hơn nhiều so với tính toán thủ công:

float paddingDp = 10f;
// Convert to pixels
int paddingPx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, paddingDp, context.getResources().getDisplayMetrics());
view.setPadding(paddingPx, paddingPx, paddingPx, paddingPx);

Về cơ bản, TypedValue.applyDimensionchuyển đổi phần đệm mong muốn thành pixel một cách thích hợp tùy thuộc vào thuộc tính hiển thị của thiết bị hiện tại.

Để biết thêm thông tin, xem: TypedValue.applyDimension Docs .


1
không nên đảo ngược px và dp?
chris838

Tôi nghĩ ý chính của những gì tôi đang làm là chính xác. Tuy nhiên, việc đặt tên là khó hiểu tôi nghĩ. Tôi sẽ chỉnh sửa nó để rõ ràng hơn. Cảm ơn vì bạn đã phản hồi.
i2097i

7

sử dụng phương pháp dưới đây để thiết lập đệm một cách linh hoạt

setPadding(int left, int top, int right, int bottom)

Thí dụ :

view.setPadding(2,2,2,2);

3

Viết mã sau để đặt phần đệm, nó có thể giúp bạn.

TextView ApplyPaddingTextView = (TextView)findViewById(R.id.textView1);
final LayoutParams layoutparams = (RelativeLayout.LayoutParams) ApplyPaddingTextView.getLayoutParams();

layoutparams.setPadding(50,50,50,50);

ApplyPaddingTextView.setLayoutParams(layoutparams);

Sử dụng LinearLayout.LayoutParamshoặc RelativeLayout.LayoutParamstheo bố cục của chế độ xem con


setPadding () không phải là một phương thức có thể truy cập từ LayoutParams. Tôi không chắc chắn nếu nó đã từng.
Sriram

2
Context contect=MainActivity.this;
TextView tview=new TextView(context);
tview.setPaddingRelative(10,0,0,0);

4
Cảm ơn bạn vì đoạn mã này, có thể cung cấp một số trợ giúp hạn chế, ngay lập tức. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những người đọc tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện.
Ma Kết

0

Trong khi đệm theo chương trình, chuyển đổi thành các giá trị liên quan đến mật độ bằng cách chuyển đổi pixel thành Dp.

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.