Добавить отступы для просмотра программно


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>

Я хотел бы установить paddingTopдля вышеуказанного <LinearLayout>элемента, и я хочу сделать это в коде Java, а не в XML.

Как установить , paddingTopчтобы <LinearLayout>в моем фрагменте кода класса Java ??


2
Вам нужно будет присвоить идентификатор вашей LinearLayout, чтобы вы могли найти его с помощью findViewByIdи затем вызвать setPaddingего.
Aleks G

@AleksG В общем, да, но, учитывая, что LinearLayout является корневым элементом раздутой иерархии, которая здесь не нужна. viewэто уже LinearLayout, нет необходимости искать его снова в этом случае. Учитывая, что это особенный, хотя.

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

Ответы:


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, как говорит Крис, это пиксели. Если вы хотите, чтобы 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 и вычисляете, что будет в пикселях для данного устройства.
Гленн85

Вы конвертируете дп в пиксель. Имена переменных сбивают с толку. «paddingPixel» действительно означает дп
Jiechao Wang

92

Если вы храните заполнение в файлах ресурсов, вы можете просто позвонить

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

Это делает преобразование для вас.



15

Вы можете установить отступы на ваш взгляд, запрограммировав весь код ниже -

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

И, также, есть другой доступный тип заполнения -

набивка

PaddingBottom

PaddingLeft

PaddingRight

PaddingTop

Эти ссылки будут ссылаться на сайт разработчиков Android. Надеюсь, это вам очень поможет.


@ Leem.fin Посмотрите на это, вы сможете узнать разницу.
Правеенкумар

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.