Koduję widok niestandardowy rozszerzony z RelativeLayout i chcę programowo zmienić jego rozmiar. Jak mogę to zrobić?
klasa widoku niestandardowego jest podobna do:
public ActiveSlideView(Context context, AttributeSet attr){
super(context, attr);
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(inflater != null){
inflater.inflate(R.layout.active_slide, this);
}
Problem rozwiązany!
UWAGA: Upewnij się, że używasz układu nadrzędnego
LayoutParams
. Mój jestLinearLayout.LayoutParams
!źródło
RelativeLayout.LayoutParams?
private void resizeView(View view, int newWidth, int newHeight) { try { Constructor<? extends LayoutParams> ctor = view.getLayoutParams().getClass().getDeclaredConstructor(int.class, int.class); view.setLayoutParams(ctor.newInstance(newWidth, newHeight)); } catch (Exception e) { e.printStackTrace(); } }
To działa dla mnie:
źródło
Powiedzmy, że chcesz zmienić rozmiar widoku w pikselach niezależnych od urządzenia ( dp ): -
Musisz użyć metody o nazwie
applyDimension
, która jest członkiem klasyTypedValue
do konwersji z pikseli na dps. Więc jeśli chcę ustawić wysokość na 150 dp (powiedzmy) - wtedy mógłbym to zrobić:gdzie wyrażenie:
getResources().getDisplayMetrics()
pobiera gęstość / rozdzielczość ekranuźródło
float pixels = context.getResources().getDimensionPixelSize(R.dimen.card_height);
W Kotlinie możesz użyć rozszerzeń ktx :
źródło
spróbuj tego:
źródło
Oto bardziej ogólna wersja powyższego rozwiązania z @herbertD:
źródło
W ten sposób zwiększyłem szerokość widoku niestandardowego
źródło
Rozwiązałem to w ten sposób… Mam w zasadzie prosty widok wewnątrz pliku xml.
źródło
https://stackoverflow.com/q/44259342/6596724
Jeśli masz tylko
two or three condition(sizes)
, możesz użyć @OverideonMeasure
jakźródło
jeśli zastępujesz
onMeasure
, nie zapomnij zaktualizować nowych rozmiarówźródło
W ten sposób to osiągnąłem. W odpowiedzi Sileria wykonał następujące czynności:
To prawda, ale oczekuje, że podamy wysokość
pixels
, ale chciałem podać wysokość,dp
którą chcę, więc dodałem:Więc będzie to wyglądać tak:
źródło
Oto co zrobiłem:
Jeśli istnieje grupa widoków, do której należy ten widok, może być konieczne wywołanie metody yourViewGroup.requestLayout (), aby odniosła skutek.
źródło