Reagera på tabändring

Diskussion i 'Frågor, support och diskussion' startad av Sigma78, 16 december 2010.

  1. Sigma78

    Sigma78 Teen Droid Medlem

    Blev medlem:
    27 juli 2010
    Inlägg:
    360
    Mottagna gillanden:
    6

    MINA ENHETER

    Jag har en tabview med tre tabbar i min applikation, och nu vill jag kunna göra saker när användaren klickar på någon av tabbarna. Det jag vill göra är en refresh på innehållet, eftersom preferenserna kan ha ändrats sen användaren var på den tabben sist.

    Hur gör man det lättast? Jag har inte hittat någon metod som körs när aktiviteten återfår fokus, eller något sätt att fånga händelen i huvudaktiviteten, som är en tabActivity.
     
  2. pruzze

    pruzze Youth Droid Medlem

    Blev medlem:
    11 augusti 2009
    Inlägg:
    145
    Mottagna gillanden:
    10

    MINA ENHETER

    onResume borde väl funka? Det är i varje fall så jag gör det.
     
  3. Sigma78

    Sigma78 Teen Droid Medlem

    Blev medlem:
    27 juli 2010
    Inlägg:
    360
    Mottagna gillanden:
    6

    MINA ENHETER

    Hmm... jag tycker att jag har provat det, men att den inte körs varje gång tabben blir aktiv. Jag får prova igen om du säger att det ska fungera.
     
  4. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 juni 2009
    Inlägg:
    1.768
    Mottagna gillanden:
    44

    MINA ENHETER

    Jag gör refresh i onResume i min TabActivity, och det funkar.
     
  5. Sigma78

    Sigma78 Teen Droid Medlem

    Blev medlem:
    27 juli 2010
    Inlägg:
    360
    Mottagna gillanden:
    6

    MINA ENHETER

    Fungerade alldeles utmärkt, jag vet inte varför det krånglade när jag försökte förra gången. Tack för hjälpen! :-)
     
  6. Sigma78

    Sigma78 Teen Droid Medlem

    Blev medlem:
    27 juli 2010
    Inlägg:
    360
    Mottagna gillanden:
    6

    MINA ENHETER

    För att slippa duplicera kod i varje tab skapade jag en klass som alla tabbarna ärver från, och helt plötsligt körs inte onResume när jag byter tab längre.

    Något tips?
     
  7. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 juni 2009
    Inlägg:
    1.768
    Mottagna gillanden:
    44

    MINA ENHETER

    Troligen körs onResume fortfarande, men i "fel" klass/flik. Hur ser koden ut?
     
  8. Sigma78

    Sigma78 Teen Droid Medlem

    Blev medlem:
    27 juli 2010
    Inlägg:
    360
    Mottagna gillanden:
    6

    MINA ENHETER

    Klassen som ärver:
    public class FirstTab extends TabTemplate {
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TabId=0;
    Day=TabId;
    }
    }

    Basklassen:
    public class TabTemplate extends Activity implements
    SharedPreferences.OnSharedPreferenceChangeListener {
    /** Called when the activity is first created. */

    protected int TabId=0;
    protected int Day = TabId;
    SharedPreferences settings;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // final Activity activity = this;

    settings = getSharedPreferences("Settings", 0);
    settings.registerOnSharedPreferenceChangeListener(this);
    setContentView(R.layout.weblayout);
    }

    @Override
    public void onResume()
    {
    super.onResume();
    refresh();
    }
    }
     
  9. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 juni 2009
    Inlägg:
    1.768
    Mottagna gillanden:
    44

    MINA ENHETER

    Hur använder tu FirstTab sedan? Lägg till spårutskrifter i onResume. Ser inte heller att du har någon metod som överlagrar refresh.
     
  10. Sigma78

    Sigma78 Teen Droid Medlem

    Blev medlem:
    27 juli 2010
    Inlägg:
    360
    Mottagna gillanden:
    6

    MINA ENHETER

    Måste jag överlagra den för att den ska köras i basklassen? Jag vill inte göra någon ändring, utan vill bara att den ska köras som den är.

    Jag provade att lägga till den med override och super.onResume (), men det förändrade inget.

    Det enda jag vill göra i firsttab är att sätta tabid till 0, i övrigt vill jag att basklassen ska exekveras orörd. I SecondTab vill jag sätta TabId till 1, men i övrigt är det inget som skiljer dem.

    Det känns lite onödigt att ha samma kod duplicerad tre gånger som jag har det nu med bara en variabel som skiljer.

    Det var över 10år sen jag programmerade sist, så jag är minst sagt rostig, därav nybörjarfrågorna.

    Sent from my GT-I9000 using Tapatalk
     
  11. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 juni 2009
    Inlägg:
    1.768
    Mottagna gillanden:
    44

    MINA ENHETER

    Nä, det behöver du inte göra, men det jag inte förstår är varför det finns tre aktiviteter. Troligen finns det bara en, och det är den som är din TabActivity. Att de andra klasserna sedan ärver activity betyder inte att de är aktiviteter. Det är därför jag undrar över hur du använder dem.

    I Snowstorm finns det bara en TabActivity, och den sätter upp sina tabbar så här:
    Kod:
    private void setupTabs() {
    
    	final TabHost tabHost = getTabHost();
        
        if (displayInfoTab) {
            tabHost.addTab(
        		tabHost.newTabSpec("info")
            		.setIndicator(getResources().getText(R.string.info_tab1_title),
            		getResources().getDrawable(R.drawable.info_tab_icon))
            		.setContent(R.id.tab1));
        }
        
        tabHost.addTab(
        		tabHost.newTabSpec("search")
            		.setIndicator(getResources().getText(R.string.info_tab2_title),
            		getResources().getDrawable(R.drawable.search_tab_icon))
            		.setContent(R.id.tab2));
        
        tabHost.addTab(
        		tabHost.newTabSpec("recent")
            		.setIndicator(getResources().getText(R.string.info_tab3_title),
            		getResources().getDrawable(R.drawable.recent_tab_icon))
            		.setContent(R.id.tab3));
        
        tabHost.setCurrentTab(0);   
    }
    
    Vet inte riktigt varför du vill ha olika aktiviteter för de olika flikarna.

    Edit: TabHost har metoden setOnTabChangedListener vilket gör att du kan lägga på en lyssnare.
     
    Last edited: 21 december 2010
    Sigma78 gillar detta.
  12. Sigma78

    Sigma78 Teen Droid Medlem

    Blev medlem:
    27 juli 2010
    Inlägg:
    360
    Mottagna gillanden:
    6

    MINA ENHETER

    Hmm, jag vågar inte svara på om det finns en eller tre aktiviteter. FirstTab, SecondTab och ThirdTab är deklarerade i androidmanifest som aktiviteter iallafall, och om jag inte gör det så kraschar programmet vid start.

    Det finns inget självändamål för mig att ha olika aktiviteter för de olika flikarna, utan jag lär mig allt eftersom, och det var så här de hade gjort i det exemplet som jag följde. Jag antog att det var ett bra sätt att göra det på bara...
    Jag gör gärna på något annat sätt om det är bättre.

    Kanske så att jag ska ge mig på lyssnaren eftersom jag inte får onResume att fungera när jag kör så här. Så här ser min SetupTabs ut:
    Kod:
    private void setupTabs(TabHost tabHost)
    	{
    
    		TabSpec firstTabSpec = tabHost.newTabSpec("tid1");
    		TabSpec secondTabSpec = tabHost.newTabSpec("tid2");
    		TabSpec thirdTabSpec = tabHost.newTabSpec("tid3");
    		firstTabSpec.setIndicator("Idag",getResources().getDrawable(android.R.drawable.ic_menu_my_calendar)).setContent(new Intent(this, FirstTab.class));
    		secondTabSpec.setIndicator("Imorgon",getResources().getDrawable(android.R.drawable.ic_media_play)).setContent(new Intent(this, SecondTab.class));
    		thirdTabSpec.setIndicator("I övermorgon",getResources().getDrawable(android.R.drawable.ic_media_next))
    				.setContent(new Intent(this, ThirdTab.class));
    
    		tabHost.addTab(firstTabSpec);
    		tabHost.addTab(secondTabSpec);
    		tabHost.addTab(thirdTabSpec);
    		
    	}
    
    Jag har inte riktigt förstått hur lyssnare fungerar, kan du ge ett exempel på hur man deklarerar en lyssnare för setOnTabChangedListener?

    Edit: Jag fick rätt på lyssnaren! Tack för hjälpen!
     
    Last edited: 21 december 2010
  13. Sigma78

    Sigma78 Teen Droid Medlem

    Blev medlem:
    27 juli 2010
    Inlägg:
    360
    Mottagna gillanden:
    6

    MINA ENHETER

    Haha! Nu hittade jag varför inte onResume verkade fungera. Jag hade deklarerat två variabler som static, och jag trodde att de instansierades upp en gång för varje klass och bara var static inom klassen, men tydligen inte...

    I onResume testade jag på dem, och fick aldrig träff. Jag hade inte räknat med att de andra tabbarna kunde ändra på dem.

    Men, men, jag har lärt mig hur man skriver en Listener för onTabsChanged på kuppen iallafall.
     
  14. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 juni 2009
    Inlägg:
    1.768
    Mottagna gillanden:
    44

    MINA ENHETER

    Kanon!
     
  15. Sigma78

    Sigma78 Teen Droid Medlem

    Blev medlem:
    27 juli 2010
    Inlägg:
    360
    Mottagna gillanden:
    6

    MINA ENHETER

    Nästa sak som jag sliter mitt hår med. Jag vill inte att första tabben ska vara den som är aktiv vid start, och det löser jag lätt med setCurrentTabByTag(x), men det verkar som att den första tabben som jag har gjort add på ändå laddas och tar tid.

    Så här ser koden ut nu:

    tabHost.addTab(NewsTabSpec);
    tabHost.addTab(FavoritesTabSpec);
    tabHost.setCurrentTabByTag("FavoritesId");
    tabHost.addTab(ForumTabSpec);
    tabHost.addTab(MarketTabSpec);

    News laddas alltid som den är nu. Jag vill att den ska vara först, men jag vill ha favorites som default och att det är den enda som laddas vid start.

    Finns det något bra sätt att göra det på?
     
  16. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 juni 2009
    Inlägg:
    1.768
    Mottagna gillanden:
    44

    MINA ENHETER

    Varför laddar du datat redan från början? Du kan ju skapa din activity, och sedan ladda datat i bakgrunden.
     
  17. Sigma78

    Sigma78 Teen Droid Medlem

    Blev medlem:
    27 juli 2010
    Inlägg:
    360
    Mottagna gillanden:
    6

    MINA ENHETER

    För att jag inte har kommit till trådning än :-)
    Provade lite, men fick inte rätt på det, så jag släppte det tills vidare.

    Är det enda sättet att lösa det på? Alternativet är klart att lägga favorit-tabben först, då är det bara dens innehåll som laddas vid start. Känns som en rätt B working-around tycker jag...

    Sent from my GT-I9000 using Tapatalk