Android rant #3


В един от app-овете имам падащ списък, който Гугъл са кръстили spinner?!? Записвам стойността, посочена от потребителя чрез този падащ списък и искам при отваряне на приложението да заредя стойността и да я задам на падащия списък. Изглежда нещо, което отнема 5 секунди, нали?
Първо трябваше да загубя три минути докато налучкам името на метода – setSelection. Окей, значи извикваме този метод с параметър поредния номер на стойността, която искаме да установим, нали?
sb.setSelection(w);
Да, само че нищо не става. След дебъгване и уверяване, че проблемът не е в мен, тръгвам да търся решение из форумите.
Ами, първо, трябвало да се зададе true на незадължителния втори параметър animate.
Супер, значи кодът става
sb.setSelection(w,true);
Пак не работи. Трябвало тоя метод да се вика само след като вече е извикан setAdapter. Вярно, има логика първо да напълниш падащия списък със съдържание, после да му избираш кой от елементите да показва.
Значи кодът с преместения от по-долу става:
ArrayAdapter dataAdapter2 = new ArrayAdapter(this,
android.R.layout.simple_spinner_item, list2);
dataAdapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sb2.setAdapter(dataAdapter2);
sb.setSelection(w,true);

Ииии имаме ефект, но частичен. Тъй като всъщност имам два spinner-а, вторият получава записаната стойност. Но не и първият? Кодът за всичко е супер аналогичен. Какво правим?
Ами всъщност, то ако се опитваш да изпълниш това на onCreate на активитито, то още не било завършено създаването му, а пък ние пипаме нещо по визуалните компоненти, които съдържа, и не можело. И затова трябвало да се отложи това задаване на стойност за след като се създаде activity-то изцяло.
Пишем значи нещо от типа на:
sb.post(new Runnable() {
public void run() {
sb.setSelection(w);
}
});

И не може, защото тоя Runnable е анонимен вътрешен клас и няма достъп до атрибутите от външния клас, ако тия атрибути не са final(което е ясно защо). Добре, значи теглим една майна на всичко, замижаваме за лошия стил искайки само да подкараме шибаното нещо да тръгне правим тези стойности атрибути на activity-то, и правим get метод, та да може да се обърнем към него от вътрешния клас.

sb.post(new Runnable() {
public void run() {
sb.setSelection(getW());
}
});

И цялата тая одисея за нещо, което на разни други езици би работило от първия опит, демек само обръщение към setSelection с параметър индекса на елемента, който да бъде зададен. Ама не, би било много лесно. Затова четене, пробване на някакви решения, дето по документацията никакви ги няма и загуба на половин час от живота ми, който е тотално пропилян, защото на разни други езици и среди това се прави за 5 секунди. От 1994 година насам…
Но мобилното не е същото като десктоп и затова ще чакаме 3000 година Гугъл да направи скапания Андроид и писането за него нещо подобно на Visual Studio, Delphi или HTML5/JS или дори Qt. Не случайно списъкът е разнороден, писането не е удобно нито като език, нито като среда.

Leave a comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.