เพิ่มช่องว่างภายในในมุมมองโดยทางโปรแกรม


235

ฉัน deveoping Android v2.2 แอพ

ฉันมีส่วน

ในการonCreateView(...)เรียกกลับของคลาสแฟรกเมนต์ของฉันฉันขยายเลย์เอาต์ไปที่แฟรกเมนต์ตามด้านล่าง:

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

    return view;
}

ไฟล์โครงร่างที่พองเกินด้านบนคือ (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>

ฉันต้องการตั้งค่าองค์ประกอบpaddingTopข้างต้น<LinearLayout>และฉันต้องการที่จะทำในรหัสJavaแทนทำใน xml

วิธีการตั้งค่าpaddingTopการ<LinearLayout>ในส่วนรหัสชั้นเรียนของฉัน Java ??


2
คุณจะต้องกำหนด ID ให้กับ LinearLayout ของคุณเพื่อที่คุณจะได้พบกับมันfindViewByIdแล้วโทรหาsetPaddingมัน
Aleks G

@AleksG โดยทั่วไปใช่ แต่ระบุว่า LinearLayout เป็นองค์ประกอบรากของลำดับชั้นที่สูงเกินจริงซึ่งไม่จำเป็นต่อที่นี่ viewเป็น LinearLayout อยู่แล้วไม่จำเป็นต้องค้นหาอีกครั้งในกรณีนี้ รับนี้เป็นคนพิเศษแม้ว่า

1
@alextsc: ใช่เห็นด้วย อย่างไรก็ตามฉันยังต้องการมอบหมาย ID ให้กับทุกสิ่งที่ฉันอาจอ้างถึงในใบสมัคร
Aleks G

คำตอบ:


486

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

สิ่งนี้จะตั้งค่าการเติมด้านบนเป็นpadding-pixels

หากคุณต้องการตั้งไว้ในdpแทนคุณสามารถทำการแปลง :

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

6
@ Leem.fin อย่างที่ Chris บอกนั่นเป็นพิกเซล หากคุณต้องการ dp คุณจะต้องทำการแปลงด้วยตนเอง:float scale = getResources().getDisplayMetrics().density; int size = (int) (sizeInPx*scale + 0.5f);
Jave

7
0.5f มาจากไหน
Herr von Wurst

11
@Georg รหัสนั้นมาจากที่นี่: developer.android.com/guide/practices/… 0.5 จะใช้เพื่อให้ได้จำนวนเต็มที่ใกล้เคียงที่สุดเมื่อทำการคัดเลือก (แทนที่จะใช้ Math.round ())
Jave

ฉันคิดว่าชื่อตัวแปรควรเป็นอย่างอื่น: sizeInDpเป็นจำนวนพิกเซลที่คุณได้รับเมื่อทำการแปลงsizeInPxdps
friederbluemle

99

ในการตอบคำถามที่สองของคุณ:

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

เช่นเดียวกับ SpK และ Jave ที่แนะนำจะตั้งค่าช่องว่างภายในเป็นพิกเซล คุณสามารถตั้งค่าเป็น dp ได้โดยการคำนวณค่า dp ดังนี้:

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

หวังว่าจะช่วย!


3
นอกหลักสูตรนี้จะรวบรวมและทำงานตามที่คาดไว้ แต่เพื่อความชัดเจนคุณควรสลับการตั้งชื่อตัวแปร int ของคุณ เนื่องจากคุณกำหนดช่องว่างภายในเป็น DP และคำนวณสิ่งที่จะเป็นพิกเซลสำหรับอุปกรณ์นี้
Glenn85

คุณกำลังแปลง dp เป็นพิกเซล ชื่อตัวแปรสับสน "paddingPixel" จริงๆหมายถึง dp
Jiechao Wang

92

หากคุณจัดเก็บช่องว่างภายในในไฟล์ทรัพยากรคุณสามารถโทรได้

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

มันเป็นการแปลงสำหรับคุณ



15

คุณสามารถตั้งค่าช่องว่างภายในไปที่มุมมองของคุณโดยโปรไวยากรณ์ตามรหัสด้านล่าง -

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

และยังมีช่องว่างภายในประเภทต่าง ๆ -

การขยายความ

PaddingBottom

PaddingLeft

PaddingRight

PaddingTop

ลิงก์เหล่านี้จะอ้างอิงไซต์นักพัฒนา Android หวังว่านี่จะช่วยคุณได้มาก


@ Leem.fin ลองดูที่นี่แล้วคุณจะรู้ถึงความแตกต่าง
Praveenkumar

9

การใช้TypedValueเป็นวิธีที่สะอาดกว่ามากในการแปลงพิกเซลเมื่อเทียบกับการคำนวณด้วยตนเอง:

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);

โดยพื้นฐานแล้วTypedValue.applyDimensionจะแปลงการเติมที่ต้องการเป็นพิกเซลอย่างเหมาะสมทั้งนี้ขึ้นอยู่กับคุณสมบัติการแสดงผลของอุปกรณ์ปัจจุบัน

สำหรับข้อมูลเพิ่มเติมโปรดดูที่: TypedValue.applyDimension เอกสาร


1
ไม่ควรสลับ px และ dp?
chris838

ฉันคิดว่าส่วนสำคัญของสิ่งที่ฉันทำถูกต้อง อย่างไรก็ตามการตั้งชื่อนั้นทำให้ฉันสับสน ฉันจะแก้ไขให้ชัดเจนยิ่งขึ้น ขอบคุณสำหรับความคิดเห็น.
i2097i

7

ใช้วิธีการด้านล่างสำหรับการตั้งค่าช่องว่างภายในแบบไดนามิก

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

ตัวอย่าง:

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

3

เขียนรหัสต่อไปนี้เพื่อตั้งช่องว่างภายในอาจช่วยคุณได้

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

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

ApplyPaddingTextView.setLayoutParams(layoutparams);

ใช้LinearLayout.LayoutParamsหรือRelativeLayout.LayoutParamsตามเค้าโครงพาเรนต์ของมุมมองชายด์


setPadding () ไม่ใช่วิธีที่เข้าถึงได้จาก LayoutParams ฉันไม่แน่ใจว่ามันเคยเป็น
ศรีราม

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

4
ขอขอบคุณสำหรับข้อมูลโค้ดนี้ซึ่งอาจให้ความช่วยเหลือแบบ จำกัด และทันที คำอธิบายที่เหมาะสมมากจะเพิ่มมูลค่าในระยะยาวด้วยการแสดงเหตุผลนี้เป็นทางออกที่ดีในการแก้ไขปัญหาและจะทำให้มันมีประโยชน์มากขึ้นให้กับผู้อ่านในอนาคตกับอื่น ๆ คำถามที่คล้ายกัน โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายรวมถึงข้อสมมติฐานที่คุณทำ
ราศีมังกร

0

ในขณะที่แพ็ดดิงโดยทางโปรแกรมให้แปลงเป็นค่าที่เกี่ยวข้องกับความหนาแน่นด้วยการแปลงพิกเซลเป็น Dp

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.