Dodaj dopełnienie do widoku programowo


235

Rozwijam aplikację na Androida 2.2.

Mam fragment .

W onCreateView(...)wywołaniu zwrotnym mojej klasy fragmentów nadmuchuję układ do fragmentu, jak poniżej:

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

    return view;
}

Powyższy plik układu jest zawyżony (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>

Chciałbym ustawić paddingTopna powyższy <LinearLayout>element i chcę to zrobić w kodzie Java zamiast w XML.

Jak ustawić paddingTop, aby <LinearLayout>w moim fragmentu kodu Java klasy ??


2
Musisz przypisać identyfikator do LinearLayout, abyś mógł go znaleźć, findViewByIda następnie wywołać setPadding.
Aleks G

@AleksG Zasadniczo tak, ale biorąc pod uwagę, że LinearLayout jest głównym elementem nadmuchanej hierarchii, która nie jest tutaj konieczna. viewjest już LinearLayout, w tym przypadku nie trzeba go ponownie znajdować. Biorąc to pod uwagę, jest to jednak wyjątkowy.

1
@alextsc: tak, zgadzam się. Niemniej jednak nadal wolę przypisywać identyfikatory do wszystkiego, do czego mogę się odwoływać w aplikacji.
Aleks G

Odpowiedzi:


486

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

Spowoduje to ustawienie górnego wypełnienia na padding-piksele.

Jeśli chcesz go dpzamiast tego ustawić , możesz dokonać konwersji :

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

6
@ Leem.fin, jak mówi Chris, to piksele. Jeśli chcesz dp, musisz wykonać konwersję ręcznie:float scale = getResources().getDisplayMetrics().density; int size = (int) (sizeInPx*scale + 0.5f);
Jave

7
Skąd pochodzi 0,5f?
Herr von Wurst,

11
@Georg Ten kod jest pobierany stąd: developer.android.com/guide/practices/... Wartość 0,5 służy do uzyskania najbliższej liczby całkowitej podczas przesyłania (zamiast Math.round ())
Jave

Myślę, że nazwy zmiennych powinny być odwrotnie: w sizeInDprzeczywistości jest to liczba pikseli, jaką uzyskujesz podczas konwersji sizeInPxdps.
friederbluemle

99

Aby odpowiedzieć na drugie pytanie:

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

jak sugerują SpK i Jave, ustawi wypełnienie w pikselach. Możesz ustawić go w dp, obliczając wartość dp w następujący sposób:

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

Mam nadzieję, że to pomaga!


3
Oczywiście to się skompiluje i będzie działać zgodnie z oczekiwaniami, ale dla zachowania przejrzystości należy zmienić nazewnictwo zmiennych wewnętrznych. Ponieważ definiujesz swoje wypełnienie w DP i obliczasz, co byłoby w pikselach dla tego urządzenia.
Glenn85,

Konwertujesz dp na piksele. Nazwy zmiennych są mylące. „paddingPixel” naprawdę oznacza dp
Jiechao Wang

92

Jeśli przechowujesz wypełnienie w plikach zasobów, możesz po prostu zadzwonić

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

Dokonuje konwersji dla Ciebie.




9

Korzystanie TypedValuejest znacznie czystszym sposobem konwersji na piksele w porównaniu do ręcznego obliczania:

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

Zasadniczo odpowiednio TypedValue.applyDimensionkonwertuje pożądane wypełnienie w piksele, w zależności od właściwości wyświetlania bieżącego urządzenia.

Aby uzyskać więcej informacji, zobacz: TypedValue.applyDimension Docs .


1
nie należy odwracać px i dp?
chris838,

Myślę, że sedno tego, co robię, jest poprawne. Jednak myślenie jest mylące. Zmienię to, aby było bardziej jasne. Dziękujemy za opinię.
i2097i

7

użyj poniższej metody do dynamicznego ustawiania paddingu

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

Przykład:

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

3

Napisz kod, aby ustawić padding, może ci to pomóc.

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

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

ApplyPaddingTextView.setLayoutParams(layoutparams);

Użyj LinearLayout.LayoutParamslub RelativeLayout.LayoutParamszgodnie z układem nadrzędnym widoku potomnego


setPadding () nie jest dostępną metodą z LayoutParams. Nie jestem pewien, czy kiedykolwiek tak było.
Sriram

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

4
Dziękujemy za ten fragment kodu, który może zapewnić ograniczoną, natychmiastową pomoc. Właściwe wyjaśnienie byłoby znacznie poprawić swoją długoterminową wartość pokazując dlaczego jest to dobre rozwiązanie problemu i byłoby bardziej użyteczne dla czytelników przyszłości z innymi, podobnymi pytaniami. Proszę edytować swoją odpowiedź dodać kilka wyjaśnień, w tym założeń już wykonanych.
Koziorożec

0

Podczas wypełniania programowo konwertuj na wartości związane z gęstością, przekształcając piksel w Dp.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.