Додайте набивання для перегляду програмно


235

Я перетворюю додаток 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>

Я хотів би встановити a paddingTopна зазначений вище <LinearLayout>елемент, і я хочу це зробити в коді Java, а не робити це в xml.

Як встановити , paddingTopщоб <LinearLayout>в моєму фрагменті коду класу Java ??


2
Вам потрібно буде призначити ідентифікатор для LinearLayout, щоб ви могли його знайти, findViewByIdа потім зателефонувати setPaddingна нього.
Алекс Г

@AleksG Загалом, так, але враховуючи, що LinearLayout є кореневим елементом завищеної ієрахії, що тут не потрібно. viewце вже LinearLayout, не потрібно його знову знайти в цьому випадку. Враховуючи це, це особливий.

1
@alextsc: так, згоден. Тим не менш, я все ж вважаю за краще присвоювати ідентифікатор будь-що, на що я можу посилатися у програмі.
Алекс Г

Відповіді:


486

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

Це встановить верхню paddingчастину накладки на -пікселі.

Якщо ви хочете встановити це dpзамість цього, ви можете зробити конверсію :

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

6
@ Leem.fin, як каже Кріс, це пікселі. Якщо ви хочете dp, вам доведеться зробити перетворення вручну:float scale = getResources().getDisplayMetrics().density; int size = (int) (sizeInPx*scale + 0.5f);
Jave

7
Звідки береться 0,5f?
Герр фон Вурст

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 Docs .


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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.