TabActivity med nestade aktiviteter

Diskussion i 'Frågor, support och diskussion' startad av Figgy, 13 apr 2012.

  1. Figgy

    Figgy Kid Droid Medlem

    Blev medlem:
    2 jan 2012
    Inlägg:
    61
    Mottagna gillanden:
    11

    MINA ENHETER

    Vart lite snopen när jag idag försöker starta en aktivitet, från en aktivitet i en tabhost tab. Det är första gången jag försöker göra detta och tabaktiviteten förs till bakgrunden när jag startar den nya aktiviteten (kanske logisk).

    Problemet är att jag hittar en massa spagettikod på internet där folk skriver egna aktivitets-stackar för att kontrollera den aktivitet som visas i den aktuella tabben. Men jag känner att det måste finnas något enklare sätt, känns lite dumt om varje utvecklare måste återuppfinna hjulet. (Kanske är jag som är lat?)

    Så min fråga är hur jag startar en aktivitet i en tabb?
    MvH
     
  2. nadam

    nadam Youth Droid Medlem

    Blev medlem:
    10 feb 2010
    Inlägg:
    182
    Mottagna gillanden:
    31
    Operatör:
    Hallon
    Telefon:
    Sony Xperia XZ1 Compact

    MINA ENHETER

    Operatör:
    Hallon
    Telefon:
    Sony Xperia XZ1 Compact
    Svaret är nej. :P

    I iPhone så är det du beskriver ganska vanligt. Android däremot är inte designat för att fungera på det sättet så det är inte bara svårt att implementera utan kan också förvirra användare. Försök hitta något annat flöde i appen som stämmer mer med hur Android är tänkt. Jämför t ex med senaste versionerna av apparna Play Store, Google+, Youtube och Google Maps och se om du kan göra din app i stil med någon av dessa.

    Du kan också arbeta med vyer inom en aktivitet om du vill byta innehåll för en viss tabb, men försök i så fall göra det på ett sätt som inte blandar in bakåtknappen.
     
  3. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 aug 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    Lite gammal tråd men då det inte har kommit något svar så...

    Ibland är ovanstående det enda vettiga sättet att lösa problemet på.

    En bra lösning jag hittade någonstans (antagligen på stackoverflow):
    TabGroupActivity.java
    Kod:
    package com.pajn.raxa.mobile.includes;
    
    import java.util.ArrayList;
    
    import com.pajn.raxa.mobile.R;
    import com.pajn.raxa.mobile.TabLibrary;
    
    import android.app.Activity;
    import android.app.ActivityGroup;
    import android.app.LocalActivityManager;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.Window;
    import android.widget.TabHost;
    import android.widget.TextView;
    
    /**
     * The purpose of this Activity is to manage the activities in a tab.
     * Note: Child Activities can handle Key Presses before they are seen here.
     * @author Eric Harlow
     */
    public class TabGroupActivity extends ActivityGroup {
    
    	private ArrayList<String> mIdList;
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		if (mIdList == null) mIdList = new ArrayList<String>();
    	}
    
    	/**
    	 * This is called when a child activity of this one calls its finish method.
    	 * This implementation calls {@link LocalActivityManager#destroyActivity} on the child activity
    	 * and starts the previous activity.
    	 * If the last child activity just called finish(),this activity (the parent),
    	 * calls finish to finish the entire group.
    	 */
    	@Override
    	public void finishFromChild(Activity child) {
    		LocalActivityManager manager = getLocalActivityManager();
    		int index = mIdList.size()-1;
    
    		if (index < 1) {
    			finish();
    			return;
    		}
    		
    		if (index == 1) {
    			TabLibrary.changeTitle(getString(R.string.rooms));
    		}
    
    		manager.destroyActivity(mIdList.get(index), true);
    		mIdList.remove(index);
    		index--;
    		String lastId = mIdList.get(index);
    		Intent lastIntent = manager.getActivity(lastId).getIntent();
    		Window newWindow = manager.startActivity(lastId, lastIntent);
    		setContentView(newWindow.getDecorView());
    	}
    
    	/**
    	 * Starts an Activity as a child Activity to this.
    	 * @param Id Unique identifier of the activity to be started.
    	 * @param intent The Intent describing the activity to be started.
    	 * @throws android.content.ActivityNotFoundException.
    	 */
    	public void startChildActivity(String Id, Intent intent) {
    		Window window = getLocalActivityManager().startActivity(Id,intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
    		if (window != null) {
    			mIdList.add(Id);
    			setContentView(window.getDecorView());
    		}
    	}
    
    	/**
    	 * The primary purpose is to prevent systems before android.os.Build.VERSION_CODES.ECLAIR
    	 * from calling their default KeyEvent.KEYCODE_BACK during onKeyDown.
    	 */
    	@Override
    	public boolean onKeyDown(int keyCode, KeyEvent event) {
    		if (keyCode == KeyEvent.KEYCODE_BACK) {
    			//preventing default implementation previous to android.os.Build.VERSION_CODES.ECLAIR
    			return true;
    		}
    		return super.onKeyDown(keyCode, event);
    	}
    
    	/**
    	 * Overrides the default implementation for KeyEvent.KEYCODE_BACK
    	 * so that all systems call onBackPressed().
    	 */
    	@Override
    	public boolean onKeyUp(int keyCode, KeyEvent event) {
    		if (keyCode == KeyEvent.KEYCODE_BACK) {
    			onBackPressed();
    			return true;
    		}
    		return super.onKeyUp(keyCode, event);
    	}
    
    	/**
    	 * If a Child Activity handles KeyEvent.KEYCODE_BACK.
    	 * Simply override and add this method.
    	 */
    	public void onBackPressed () {
    		int length = mIdList.size();
    		if ( length > 1) {
    			Activity current = getLocalActivityManager().getActivity(mIdList.get(length-1));
    			current.finish();
    		}
    	}
    }
    DinTabGroup.java
    Kod:
    package com.pajn.raxa.mobile.includes;
    
    import com.pajn.raxa.mobile.Rooms;
    
    import android.content.Intent;
    import android.os.Bundle;
    
    public class RoomsTabGroup extends TabGroupActivity {
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		startChildActivity("rooms", new Intent(this, Rooms.class));
    	}
    }
    Låt TabHosten peka på DinTabGroup.java.
    Klassen som intenten i DinTabGroup.java startar är sedan den tabben du ville visa från början. När du ska vidare till nästa activity i tabben använder du
    Kod:
    TabGroupActivity parentActivity = (TabGroupActivity) getParent();
                 		parentActivity.startChildActivity("devicesRoom", intent);
    Jag gillar lösningen då den låter koden i tabbarna som använder den vara nästan orörd.