5 Stimmen

Aktion auf eine andere Aktivität innerhalb des TabHost auslösen? (Android)

Ich bin derzeit in einem Android-Projekt, bei dem unsere Hauptansicht eine TabActivity ist und jeder Tab eine separate Activity ist. Einer ist eine MapActivity und die anderen beiden sind normale Activities.

Zunächst einmal denke ich, dass wir jeden Tab als separate Aktivitäten haben müssen, da es zu viel Code in den separaten Aktivitäten gibt, um einfach den TabHost den Inhaltsansicht bei einem Tabwechsel wechseln zu lassen und den gesamten Code in derselben Klasse zu haben. Wie dem auch sei, zurück zum Problem.

Einer der Tabs enthält eine Schaltfläche, die beim Drücken die TabActivity zur MapActivity wechseln und die Karte zu einem bestimmten Ort animieren soll.

Das Tutorial auf http://joshclemm.com/blog/?p=86 zeigt, wie es gemacht wird, wenn der TabHost eine Karte und eine Listview enthält. Wenn auf ein Element in der ListView geklickt wird, wechselt der TabHost zur Karte und animiert zu diesem Ort (diesen Koordinaten). Genau das muss ich tun, wenn die Schaltfläche in der separaten Aktivität gedrückt wird.

Die MainView.java wird wie folgt erstellt:

public class MainView extends TabActivity implements OnTabChangeListener{
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Resources res = getResources(); // Ressourcenobjekt zum Abrufen von Zeichnungen
    TabHost tabHost = getTabHost();  // Der TabHost der Aktivität
    TabHost.TabSpec spec;  // Wiederverwendbare TabSpec für jeden Tab
    Intent intent;  // Wiederverwendbares Intent für jeden Tab

intent = new Intent().setClass(this, MapGUI.class);
    spec = tabHost.newTabSpec("map").setIndicator("Karte",
                      res.getDrawable(R.drawable.ic_tab_menu_item))
                  .setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, MissionView.class);
    spec = tabHost.newTabSpec("mission").setIndicator("Mission",
                      res.getDrawable(R.drawable.ic_tab_menu_item))
                  .setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, SIPView.class);
    spec = tabHost.newTabSpec("call").setIndicator("Anruf",
                      res.getDrawable(R.drawable.ic_tab_menu_item))
                  .setContent(intent);
    tabHost.addTab(spec);

Die MissionView.java sieht wie folgt aus:

public class MissionView extends Activity implements Observer{

MissionController mc;
private TextView missionheader, missiondescription, missionaddress, 
missiontime, missioninjuries;
private Button changedesc, gotoadress;
private String[] mission;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.missiontablayout);
    missionheader = (TextView)findViewById(R.id.missionheader2);
    missiondescription = (TextView)findViewById(R.id.missiondescription2);
    missionaddress = (TextView)findViewById(R.id.missionaddress2);
    missiontime = (TextView)findViewById(R.id.missiontime2);
    missioninjuries = (TextView)findViewById(R.id.missioninjuries2);

    changedesc = (Button)findViewById(R.id.gotoaddress);
    changedesc.setOnClickListener(new OnClickListener() {           
        public void onClick(View v) {
         // ETWAS TUN HIER?              
        }
    }); 
    mc = new MissionController(MissionView.this);
}

public void update(Observable observable, Object data) {
    if(data instanceof String[]){
        mission = (String[]) data;
        updateView(mission);
    }
}
public void updateView(String[] missiontext){
    missionheader.setText(missiontext[0]);
    missiondescription.setText(missiontext[1]);
    missionaddress.setText(missiontext[2]);
    missiontime.setText(missiontext[3]);
    missioninjuries.setText(missiontext[4]);
}

}

Weiß jemand, wie ich das erreichen könnte?

Beachten Sie, dass der oben bereitgestellte Code keine Implementierung zum tatsächlichen Zeichnen am tatsächlichen Ort hat, aber die Frage bleibt dennoch, wie ich erreichen kann, dass beim Drücken einer Schaltfläche in einer Aktivität der TabHost den Tab wechselt und eine Änderung in dieser Tab-Aktivität auslöst?

0voto

Goddchen Punkte 4449

Das Wechseln von Registerkarten in einem TabHost kann einfach mit setCurrentTab(int) durchgeführt werden http://developer.android.com/reference/android/widget/TabHost.html#setCurrentTab(int)

Das Senden von Ereignissen an andere Aktivitäten kann einfach erreicht werden, indem ein Broadcast Intent gesendet und in der anderen Aktivität empfangen/verarbeitet wird.

Alternativ könnten Sie statische Referenzen zu allen Ihren Tab-Aktivitäten speichern (hässlich...) und Methoden direkt aufrufen.

0voto

iCoder Punkte 1

Platzieren Sie die folgende Zeile beim Klicken auf die Schaltfläche, mit der Sie zur Kartenaktivität wechseln möchten

((MainView) getParent()).setTabMap();

und erstellen Sie in MainView die folgende Funktion

public void setTabMap()
{
   // da die Kartenaktivität Ihr erster Tab ist, geben Sie 0 als Index an
   getTabHost().setCurrentTab(0);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X