Tambahkan padding pada tampilan secara terprogram


235

Saya deveoping aplikasi Android v2.2.

Saya memiliki sebuah fragmen .

Dalam onCreateView(...)panggilan balik kelas fragmen saya, saya mengembang tata letak ke fragmen seperti di bawah ini:

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

    return view;
}

File tata letak yang meningkat di atas adalah (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>

Saya ingin mengatur a paddingTopke <LinearLayout>elemen di atas , dan saya ingin melakukannya dalam kode Java daripada melakukannya di xml.

Bagaimana mengatur paddingTopke <LinearLayout>dalam kode kelas Java fragmen saya ??


2
Anda harus menetapkan ID untuk LinearLayout Anda sehingga Anda bisa menemukannya findViewByIddan kemudian memanggilnya setPadding.
Aleks G

@AlexG Secara umum ya, tetapi mengingat bahwa LinearLayout adalah elemen root dari hirarki yang meningkat yang tidak perlu di sini. viewsudah menjadi LinearLayout, tidak perlu menemukannya lagi dalam kasus ini. Mengingat ini adalah yang istimewa.

1
@alextsc: ya, setuju. Namun demikian, saya masih lebih suka untuk menetapkan ID untuk apa pun yang dapat saya lihat dalam aplikasi.
Aleks G

Jawaban:


486

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

Ini akan mengatur padding atas ke padding-pixels.

Jika Anda ingin mengaturnya sebagai dpgantinya, Anda dapat melakukan konversi :

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

6
@ Leem.fin seperti kata Chris, ini piksel. Jika Anda ingin dp, Anda harus melakukan konversi secara manual:float scale = getResources().getDisplayMetrics().density; int size = (int) (sizeInPx*scale + 0.5f);
Jave

7
Dari mana datangnya 0,5f?
Herr von Wurst

11
@ Georg Kode itu diambil dari sini: developer.android.com/guide/practices/... 0,5 digunakan untuk mendapatkan bilangan bulat terdekat saat melakukan casting (alih-alih menggunakan Math.round ())
Jave

Saya pikir nama-nama variabel harus sebaliknya: sizeInDpsebenarnya jumlah piksel yang Anda dapatkan ketika mengkonversi sizeInPxdps.
friederbluemle

99

Untuk menjawab pertanyaan kedua Anda:

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

seperti yang disarankan SpK dan Jave, akan mengatur padding dalam piksel. Anda dapat mengaturnya dalam dp dengan menghitung nilai dp sebagai berikut:

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

Semoga itu bisa membantu!


3
Tentunya ini akan mengkompilasi dan bekerja seperti yang diharapkan, tetapi demi kejelasan Anda harus mengganti penamaan variabel int Anda. Karena Anda menentukan padding Anda di DP dan menghitungnya dalam pixel untuk perangkat yang diberikan ini.
Glenn85

Anda mengonversi dp ke piksel. Nama-nama variabel membingungkan. "paddingPixel" benar-benar berarti dp
Jiechao Wang

92

Jika Anda menyimpan padding dalam file sumber daya, Anda bisa menelepon

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

Itu melakukan konversi untuk Anda.




9

Menggunakan TypedValueadalah cara yang jauh lebih bersih untuk mengonversi piksel dibandingkan dengan menghitung secara manual:

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

Intinya, TypedValue.applyDimensionubah padding yang diinginkan menjadi piksel secara tepat tergantung pada properti tampilan perangkat saat ini.

Untuk info lebih lanjut, lihat: TypedValue.applyDimension Docs .


1
bukankah seharusnya px dan dp dibalik?
chris838

Saya pikir inti dari apa yang saya lakukan adalah benar. Namun penamaannya membingungkan saya pikir. Saya akan mengeditnya agar lebih jelas. Terima kasih untuk umpan baliknya.
i2097i

7

gunakan metode di bawah ini untuk mengatur bantalan secara dinamis

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

Contoh:

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

3

Menulis Kode Mengikuti untuk mengatur padding, ini dapat membantu Anda.

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

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

ApplyPaddingTextView.setLayoutParams(layoutparams);

Gunakan LinearLayout.LayoutParamsatau RelativeLayout.LayoutParamssesuai dengan tata letak induk dari tampilan anak


setPadding () bukan metode yang dapat diakses dari LayoutParams. Saya tidak yakin apakah itu pernah ada.
Sriram

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

4
Terima kasih atas cuplikan kode ini, yang mungkin memberikan bantuan terbatas dan segera. Sebuah penjelasan yang tepat akan sangat meningkatkan nilai jangka panjang dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah ini dan akan membuatnya lebih bermanfaat untuk pembaca masa depan dengan lainnya, pertanyaan-pertanyaan serupa. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan, termasuk asumsi yang Anda buat.
Capricorn

0

Saat melapisi secara terprogram, konversikan ke nilai terkait kerapatan dengan mengubah piksel menjadi Dp.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.