4 Stimmen

Wie man Hauptaktivität und Datumsauswahl in eigene Klassen trennt

Dieses kleine Ding begann mich sehr zu frustrieren. Ich dachte, es sei etwas Einfaches zu tun, aber ich glaube, ich habe nicht klar verstanden, wie Android funktioniert.

Wie dem auch sei, das Problem ist, dass meine Android-Anwendung einige Schaltflächen haben wird, die beim Drücken ein Dialogfeld für Datum oder Uhrzeit öffnen. Ich weiß, wie man sie direkt in derselben Klasse wie die Hauptaktivität implementiert, aber ich glaube nicht, dass dies eine gute Lösung aus Gründen der Wartbarkeit ist und auch, wenn ich diese Anwendung irgendwann weiterentwickeln werde.

Ich habe versucht, dies auf verschiedene Weisen zu tun und jedes Mal gescheitert, wenn ich es versucht habe. Das hat mich ziemlich ratlos gelassen, was zu tun ist und wo das Problem liegt.

Hier ist eine Methode, die ich versucht habe:

die Hauptaktivität (ich habe sie vereinfacht und versucht, nur den notwendigen Code bereitzustellen, da er lang ist). Dies folgt dem Singleton-Entwurfsmuster.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    dateButton = (Button) findViewById(R.id.editDateButton);

    dateButton.setOnClickListener(this);
}

@Override
public void onClick(View view) {
    if(view.getId() == R.id.editStartDateButton) {
        DatePickers.getInstance().setDate(dateButton);
    }
}

Die DatePickers-Klasse (erweitert Activity; ebenfalls vereinfachter Code und alle unnötigen Dinge entfernt):

private static DatePickers self = null;

public static DatePickers getInstance() {
    if (null == self) {
        self = new DatePickers();
    }
    return self;
}

public void setDate(Button button) {
    theButtonUsed = button;
    showDialog(DATE_DIALOG_ID);
}

Nach dem Aufruf von showDialog ist die Klasse ähnlich wie im Beispiel Hello-DatePicker auf der Android-Entwicklerseite.

Ich habe auch versucht, es so ziemlich wie hier zu tun, aber mit dem Unterschied, dass wenn auf dateButton geklickt wird, es die neue Aktivität startet, die den Datumsauswahldialog enthält. In diesem Fall sah die datePicker-Klasse so aus:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.datePicker);

    showDialog(DATE_DIALOG_ID);
}

Und der Rest wie im Beispiel Hello-DatePicker auf der Android-Dev-Site. Beide Lösungen führten zu einem Problem, bei dem meine Anwendung abgestürzt ist und beendet werden musste.

Ich hoffe, Sie verstehen, wo das Problem liegt, und dass Sie mich führen und zeigen können, was ich falsch mache. Ich habe versucht, dies kurz zu halten und nur die notwendigen Informationen bereitzustellen.

Danke -Z

Bearbeitet:

Wie ich in einem der Kommentare erwähnt habe, war das eigentliche Problem dabei, dass ich schlicht vergessen hatte, die neue Aktivität zur Manifestdatei hinzuzufügen. Es könnte noch andere Probleme gegeben haben, die mit der akzeptierten Antwort gelöst wurden. Ich hoffe, dass dies immer noch hilfreich ist für alle, die ähnliche Probleme haben.

1voto

serkanozel Punkte 2917

Ich denke, ich kann dir dort helfen.

Ich weiß, dass meine Lösung nicht dem Singleton-Ansatz folgen wird, aber sie trennt definitiv den DatePicker-Code von der aufrufenden Aktivität oder den Aktivitäten ab - was wiederum modular und sauber wird.

Also, los geht's: Unten befindet sich der festgelegte DatePicker-Code (ich habe ihn DateSelector genannt). Sie starten diese activityForResult und sie gibt ein Bundle mit Tag, Monat und Jahr an die aufrufende Aktivität zurück.

Ich werde auch das einfache Layout einfügen, das DateSelector direkt darunter verwendet; es ist einfach ein transparentes Layout...

paket com.cyberfabric.historicise.activities;

import java.util.Calendar;

import com.cyberfabric.historicise.R;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;

import android.view.Window;

public class DateSelector extends Activity{

    private final static int DIALOG_DATE_PICKER = 0;

    private int setYear;
    private int setMonth;
    private int setDay;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.date_picker);

        Calendar today = Calendar.getInstance();
        setYear = today.get(Calendar.YEAR);
        setMonth = today.get(Calendar.MONDAY);
        setDay = today.get(Calendar.DAY_OF_MONTH);

        showDialog(DIALOG_DATE_PICKER); 
    }

    @Override
    protected Dialog onCreateDialog(int id){
        switch(id){
            case DIALOG_DATE_PICKER:
                return new DatePickerDialog(this, mDateSetListener, setYear, setMonth, setDay);
            }
        return null;
    }

    private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener(){
        @Override
        public void onDateSet(android.widget.DatePicker view, int year, int month, int day) {
            setYear = year;
            setMonth = month;
            setDay = day;
            returnDate();
        }
    };

    /*
     * Verpacke die Daten und gib sie an die aufrufende Absicht zurück
     */
    private void returnDate(){
        Intent intent = getIntent();    // aufrufende/übergeordnete Absicht //

        Bundle bundle = new Bundle();
        bundle.putInt("year", setYear);
        bundle.putInt("month", setMonth);
        bundle.putInt("day", setDay);
        intent.putExtra("set_date", bundle);

        setResult(Activity.RESULT_OK, intent);

        finish();
    }
}  

Hier ist das Layout, das DateSelector verwendet:

Ihre aufrufende Aktivität oder Aktivitäten sollten DateSelector wie folgt starten:

// einige global deklarierte Variable, um startActivityForResult zu starten und es auf onActivityResult zu fangen
private final static int REQUEST_GET_DATE = 3;

Starten des DateSelector von der aufrufenden Aktivität:

Intent dp = new Intent(EventForm.this, DateSelector.class);
EventForm.this.startActivityForResult(dp, REQUEST_GET_DATE);

Und schließlich in Ihrer aufrufenden Aktivität fangen Sie es einfach in onActivityResult ab:

protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
    super.onActivityResult(requestCode, resultCode, data); 

    switch(requestCode){ 
        case REQUEST_GET_DATE:
            if(resultCode == Activity.RESULT_OK){
                Bundle setDate = data.getBundleExtra("set_date");
                int setDay = setDate.getInt("day");
                int setMonth = setDate.getInt("month");
                int setYear = setDate.getInt("year");
                System.out.println(setDay + " " + setMonth + " " + setYear);
            }
            break;
    }
}

Ich hoffe, das hilft dir, ich hoffe, es gefällt dir,

Beste,

-serkan

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