Próbuję użyć Java ( nie XML ) do utworzenia LinearLayout z przyciskami wypełniającymi ekran i posiadającymi marginesy. Oto kod, który działa bez marginesów:
LinearLayout buttonsView = new LinearLayout(this);
buttonsView.setOrientation(LinearLayout.VERTICAL);
for (int r = 0; r < 6; ++r) {
Button btn = new Button(this);
btn.setText("A");
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); // Verbose!
lp.weight = 1.0f; // This is critical. Doesn't work without it.
buttonsView.addView(btn, lp);
}
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(buttonsView, lp);
Więc to działa dobrze, ale jak, u licha, dajesz marginesy przyciskom, żeby między nimi była przestrzeń? Próbowałem użyć LinearLayout.MarginLayoutParams
, ale to nie ma weight
członka, więc nie jest dobrze. I to nie działa, jeśli przekażesz go również lp
do jego konstruktora.
Czy to jest niemożliwe? Ponieważ na pewno wygląda i nie byłoby to pierwsze zadanie układu Androida, które można wykonać tylko w języku XML.
Odpowiedzi:
Oto mały kod, aby to zrobić:
źródło
Dzwonisz
setMargins()
naLinearLayout.LayoutParams
obiekcie.LinearLayout.LayoutParams
jest podklasąLinearLayout.MarginLayoutParams
, jak wskazano w dokumentacji .Nie.
Zapraszamy do przedstawienia dowodu tego roszczenia.
Osobiście nie jestem świadomy niczego, co można osiągnąć tylko za pomocą XML, a nie metod Java w SDK. W rzeczywistości z definicji wszystko musi być wykonalne przez Javę (choć niekoniecznie metodami dostępnymi w SDK), ponieważ XML nie jest kodem wykonywalnym. Ale jeśli coś wiesz, zwróć na to uwagę, ponieważ jest to błąd w zestawie SDK, który kiedyś powinien zostać naprawiony.
źródło
LayoutPararms
. Mówię o stylach ... tak, cóż, jest powód, dla którego ich nie używam. :-)Aby dodać marginesy bezpośrednio do pozycji (niektóre pozycje umożliwiają bezpośrednią edycję marginesów), możesz:
... działa to bez konieczności znajomości / edycji otaczającego układu. Zwróć uwagę na sprawdzenie „instanceof” na wypadek, gdybyś spróbował uruchomić to z czymś, co nie obsługuje marginesów.
źródło
Ze względu na różnice w gęstości pikseli ekranu urządzenia dobrze jest zawsze używać
DIP
jednostki, aby programowo ustawić margines. Jak poniżejMam nadzieję, że to pomoże.
źródło
Marginesy ustawiłem bezpośrednio przy użyciu poniższego kodu
Jedyną rzeczą jest tutaj, aby zauważyć, że
LayoutParams
należy zaimportować kolejny pakietandroid.widget.RelativeLayout.LayoutParams
, w przeciwnym razie wystąpi błąd.źródło
Spróbuj tego
źródło
źródło
Spróbuj tego:
źródło
powinieneś być typem widoku viewGroup. W powyższym kodzie, na przykład, chcę zmienić margines frameLayout, a grupa widoków frameLayout jest RelativeLayout , więc musisz się ukryć przed (RelativeLayout.LayoutParams)
źródło
Oto rozwiązanie jednoliniowe:
źródło