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 ??

Leem.fin
sumber
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);
Jave
sumber
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!

Chris Conway
sumber
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.

Miklos Jakab
sumber
18

Menggunakan Kotlin dan pustaka android-ktx, Anda bisa melakukannya

view.updatePadding(top = 42)

Lihat dokumen di sini

Andrew Orobator
sumber
15

Anda dapat mengatur padding ke tampilan Anda dengan secara tata bahasa di seluruh kode di bawah ini -

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

Dan, juga ada berbagai jenis bantalan yang tersedia -

Lapisan

PaddingBottom

PaddingLeft

PaddingRight

PaddingTop

Tautan ini akan merujuk situs Pengembang Android. Semoga ini banyak membantu Anda.

Praveenkumar
sumber
@ Leem.fin Lihatlah yang ini Anda akan dapat mengetahui perbedaannya.
Praveenkumar
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 .

i2097i
sumber
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);
Sai Gopi N
sumber
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

Manikandan K
sumber
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);
Siddhartha Halder
sumber
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.

Bhagya
sumber