ViewPager - extern XML layout

Diskussion i 'Frågor, support och diskussion' startad av HimpoN, 5 dec 2011.

  1. HimpoN

    HimpoN Youth Droid Medlem

    Blev medlem:
    9 feb 2010
    Inlägg:
    123
    Mottagna gillanden:
    14
    Telefon:
    Sony Xperia Z2 compact

    MINA ENHETER

    Telefon:
    Sony Xperia Z2 compact
    Telefon 2:
    Nexus 4
    Platta:
    Nexus 7 (2013)
    Hej,

    Jag håller på att labba med en app där jag använder mig av en ViewPager för att åstadkomma ett horisontellt scrollande gränssnitt.

    Jag har tre sidor i min ViewPager, sidorna hämtar layout från varsin XML som inflate:as vid instantiateItem().
    Detta fungerar utmärkt att visa, jag har dock problem med att interagera med widgetar i dessa layouter.

    Ex.
    I onCreate för min aktivitet skapar jag en onClickListener "som vanligt":
    Kod:
    Button butt1 = (Button) finViewById(R.id.button1);
    butt1.setOnClickListener(new View.OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				Log.d("butt1", "onClick");
    			}
    		});
    Denna kod går utmärkt att bygga och exekvera, dock så fungerar knappen inte, inget syns i logcat när jag trycker på den.
    (Denna knapp finns alltså i en annan layout-XML än main.xml, om det nu spelar roll(?))

    Jag är väldigt ny på Java/Android, så det är mycket möjligt att jag gjort ett riktigt idiotfel.

    All hjälp tages tacksamt emot!

    /Niklas
     
  2. DreamHawk

    DreamHawk Android Medlem

    Blev medlem:
    28 maj 2010
    Inlägg:
    6 113
    Mottagna gillanden:
    420
    Operatör:
    Tele2
    Telefon:
    iPhone 7

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    iPhone 7
    ROM:
    IOS11
    Telefon 2:
    Google Galaxy Nexus
    ROM:
    LineageOS
    När du trycker på knappen så loggas det, precis som du skrivit. Om du vill att något annat ska hända, bygg vidare på din onCreate :-)

    Sent from my Nexus S with ICS using Tapatalk
     
  3. HimpoN

    HimpoN Youth Droid Medlem

    Blev medlem:
    9 feb 2010
    Inlägg:
    123
    Mottagna gillanden:
    14
    Telefon:
    Sony Xperia Z2 compact

    MINA ENHETER

    Telefon:
    Sony Xperia Z2 compact
    Telefon 2:
    Nexus 4
    Platta:
    Nexus 7 (2013)
    Fast nu skrev jag ju att det inte syns i logcat och det är det som är mitt problem! ;)
     
  4. DreamHawk

    DreamHawk Android Medlem

    Blev medlem:
    28 maj 2010
    Inlägg:
    6 113
    Mottagna gillanden:
    420
    Operatör:
    Tele2
    Telefon:
    iPhone 7

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    iPhone 7
    ROM:
    IOS11
    Telefon 2:
    Google Galaxy Nexus
    ROM:
    LineageOS
    Oj, läste det som att det stod i logcat :-\.

    Kollar mer på det sen när jag sitter vid datorn, om ingen annan hunnit före, men det ser bra ut?

    Försök lägga in en toast istället? :-)

    Sent from my Nexus S with ICS using Tapatalk
     
  5. HimpoN

    HimpoN Youth Droid Medlem

    Blev medlem:
    9 feb 2010
    Inlägg:
    123
    Mottagna gillanden:
    14
    Telefon:
    Sony Xperia Z2 compact

    MINA ENHETER

    Telefon:
    Sony Xperia Z2 compact
    Telefon 2:
    Nexus 4
    Platta:
    Nexus 7 (2013)
    Körde faktiskt en Toast först, när den inte syntes funderade jag på om jag skickade rätt context till maketext och bytte till att skriva i loggen för at slippa fundera på det...
    Att skriva till loggen funkar int i resten av appen så det skall inte vara något problem, koden i onClick körs helt enkelt inte...
     
  6. HimpoN

    HimpoN Youth Droid Medlem

    Blev medlem:
    9 feb 2010
    Inlägg:
    123
    Mottagna gillanden:
    14
    Telefon:
    Sony Xperia Z2 compact

    MINA ENHETER

    Telefon:
    Sony Xperia Z2 compact
    Telefon 2:
    Nexus 4
    Platta:
    Nexus 7 (2013)
    Sorry för bump, men hittar ingen lösning...

    Jag har i princip följt detta exemplet.

    Min instantiateItem ser ut så här:
    Kod:
    	public Object instantiateItem(View pager, int pos ) {
    				
    		ViewPager vp = (ViewPager) pager;
    		
    		LayoutInflater layoutinflater = activity.getLayoutInflater();
    		View nv = layoutinflater.inflate(RArray[pos], null);	
    		vp.addView(nv, pos);
    
    		return nv;
    	}
    
    	}
    Teorier varför det inte fungerar jag haft hitils:

    Jag behöver skicka med en viewgroup till inflatern ist. för null ?
    Dock tolkar jag det som att det är ifall man vill lägga in sin ny-inflateade view i en parent-view, men det är väl det jag gör med vp.addView ..?
    Förösker jag skicka med vp som ViewGroup till inflatern får jag runtimefel..

    Skall jag, som jag gör i koden ovan hämta en inflater från min aktivitet?
    Det verkar gå lika bra (dåligt) att köra:
    Kod:
     View nv = (View) ViewPager.inflate(pager.getContext(), RArray[pos], null);
    Skapar jag en ny inflater då, eller blir det samma som via activity.getLayoutInflater?

    Mina layout-XML:er är:
    main.xml - innehåller linearlayout, viewpagerindicator.TitlePageIndicator och
    ViewPager.
    page1.xml, page2.xml, page3.xml innehåller mina layouts för varje sida.
    Det går som sagt bra att inflate:a dessa och visa dem i min viewpager, men jag kan inte interagera med dess widgets.
    Nu upptäckte jag att jag kan ha widgets i mina layouter med samma id utan att få något fel.
    Ex. jag kan skapa button1 på både sida 2 och 3 och sen bygga/köra programmet utan varning/fel, är det väntat?
    Det känns som jag satt upp mitt projekt fel på något sätt, om det inte blir fel av att ha ett icke-unikt id på min knapp så känns det rimligt att jag inte kan lyssna efter click på den...

    Jag har även försökt med att hämta knappen (se första posten) genom:
    Kod:
    Button butt1 = (Button) pager.findViewById(R.id.button1);
    istället för via aktivitetens findViewById.

    Som sagt så är jag väldigt ny på detta, så det kan vara något riktigt grundläggande jag förbisett.

    Ideer?
     
  7. ozp

    ozp Teen Droid Medlem

    Blev medlem:
    6 maj 2010
    Inlägg:
    250
    Mottagna gillanden:
    31

    MINA ENHETER

    Du måste hämta knappen från den view den ligger i.

    Alltså måste du göra:

    Button butt1 = (Button)nv.findViewById(R.id.button1);
     
  8. HimpoN

    HimpoN Youth Droid Medlem

    Blev medlem:
    9 feb 2010
    Inlägg:
    123
    Mottagna gillanden:
    14
    Telefon:
    Sony Xperia Z2 compact

    MINA ENHETER

    Telefon:
    Sony Xperia Z2 compact
    Telefon 2:
    Nexus 4
    Platta:
    Nexus 7 (2013)
    Tack för svaret!

    Löste det faktiskt precis på egen hand genom att jag insåg att ViewPager vid deaultinställning (mOffscreenPageLimit = 1) hela tiden kommer att ta bort och skapa mina views; alltså dumt att sätta onclick för knappen i aktivitetens onCreate.

    Iofs gjorde jag så att jag höjde limiten till 2, vilket gör att mina page-views bara skapas en gång, men för en robust implementering ifall jag vill bygga vidare är att istället sätta onClick (och liknande) vid instantiateItem.

    Man lär sig mycket genom att förklara sitt problem! :)

    Blev rätt snyggt för en rätt liten arbetsinsats, nu återstår bara att komma på en bra app-idé. ;)
    Om någon är sugen på att se resultatet:
    http://dl.dropbox.com/u/5910312/viewpager.apk
     
    Last edited: 7 dec 2011
  9. DreamHawk

    DreamHawk Android Medlem

    Blev medlem:
    28 maj 2010
    Inlägg:
    6 113
    Mottagna gillanden:
    420
    Operatör:
    Tele2
    Telefon:
    iPhone 7

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    iPhone 7
    ROM:
    IOS11
    Telefon 2:
    Google Galaxy Nexus
    ROM:
    LineageOS
    Går inte att installera :-\ har du signerat filen?

    Sent from my Nexus S with ICS using Tapatalk
     
  10. HimpoN

    HimpoN Youth Droid Medlem

    Blev medlem:
    9 feb 2010
    Inlägg:
    123
    Mottagna gillanden:
    14
    Telefon:
    Sony Xperia Z2 compact

    MINA ENHETER

    Telefon:
    Sony Xperia Z2 compact
    Telefon 2:
    Nexus 4
    Platta:
    Nexus 7 (2013)
    Naturligtvis inte! ;);)
    Nu är den signerad och zipalignad! :)

    (Tips: ratingen på sida 3 avgör vart hoppet blir! ;))
     
  11. DreamHawk

    DreamHawk Android Medlem

    Blev medlem:
    28 maj 2010
    Inlägg:
    6 113
    Mottagna gillanden:
    420
    Operatör:
    Tele2
    Telefon:
    iPhone 7

    MINA ENHETER

    Operatör:
    Tele2
    Telefon:
    iPhone 7
    ROM:
    IOS11
    Telefon 2:
    Google Galaxy Nexus
    ROM:
    LineageOS
    Nice ju! :O, nåt sånt kanske man skulle ha i Enkla Anteckningar... Scrolla vänster och höger bland noteringarna :)