Einfache Model View Controller Architektur

  • 19 Antworten
  • Neuester Beitrag
Diskutiere Einfache Model View Controller Architektur im Android App Entwicklung im Bereich Betriebssysteme & Apps.
B

ben56a

Ambitioniertes Mitglied
Hallo,

ich bin gerade dabei eine App zu programmieren, die als Grundstruktur eine MVC - Architektur haben soll.

Wie ich bislang dachte, ist die onCreate in meiner MainActivity sozusgen die Main-Funktion, die als erstes beim Programmstart aufgerufen wird.
Folglich habe ich eine View Programmier:

Code:
public class View extends Activity{
    
    private TextView tfEingabe;
    private TextView tfAusgabe;
    private Button butSend;
    
    public View(){
        this.tfEingabe = (TextView)findViewById(R.id.tfEingabe);
        this.tfAusgabe = (TextView)findViewById(R.id.tfAusgabe);
        this.butSend = (Button)findViewById(R.id.Button01);
   }
    public CharSequence getEingabe()
    {
        return this.tfEingabe.getText();
    }
    public void setEingabe(CharSequence input)
    {
        this.tfAusgabe.setText(input);
    }
    public void addActionListenerAusgabe(OnClickListener cl)
    {
        this.butSend.setOnClickListener(cl);
    }
    
}
auch einen Controller habe ich geschrieben:
Code:
public class Controller {

    View m;
    Ausgabe a;
    public Controller(Ausgabe a, View m)
    {
        this.m = m;
        this.a = a;
        setListener();
    }
    public void setListener()
    {
        m.addActionListenerAusgabe(new setOnClickListener());
    }
    
    class setOnClickListener implements OnClickListener{

        public void onClick(View v) {
            String eing = m.getEingabe();
            m.setEingabe(a.Convert(eing));
            
        }
        
    }
}
Mein Model macht convertiert momentan einfach nur die Eingabe:
Code:
public class Ausgabe {

    public String Convert(String input)
    {
        return input.toUpperCase();
    }
}
Nun dachte ich mir, dass man in der MainActivity folgendes macht:
Code:
public class MainActivity extends Activity {
    /** Called when the activity is first created. */
      
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Ausgabe a = new Ausgabe();
        View v = new View();
        Controller c = new Controller(a, v);
    }     
}
Leider funktioniert das ganze aber nicht so wie ich mir das vorstelle. Ich bekomme nach dem Programmstart eine Exception.

Hat mir jemand einen Tip ob ich die MVC - Architektur so umsetzen kann?
 
S

swordi

Lexikon
so auf die schnelle würd ich mal sagen, du hast einen fehler im source code. ;)

1) wenn du schon von exceptions redest, warum kopierst du sie nicht hier rein, niemand kann hellsehen.

2) du nennst deine Klasse View - das könnte zu Problemen führen.
 
B

ben56a

Ambitioniertes Mitglied
swordi schrieb:
so auf die schnelle würd ich mal sagen, du hast einen fehler im source code. ;)

1) wenn du schon von exceptions redest, warum kopierst du sie nicht hier rein, niemand kann hellsehen.

2) du nennst deine Klasse View - das könnte zu Problemen führen.
Ich glaube nicht, dass man mit der Exception etwas anfangen kann:
The Application "Applicationname" has stopped unexpectadly. Please try again.

Das mit der Klasse View habe ich bereits selbst gemerkt und auch schon behoben, daran liegt es aber nicht.
 
A

Asfaloth

Fortgeschrittenes Mitglied
Ich glaube swordi meinte eher den LogCat Log. Den solltest du kopieren ;)
 
B

ben56a

Ambitioniertes Mitglied
Asfaloth schrieb:
Ich glaube swordi meinte eher den LogCat Log. Den solltest du kopieren ;)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): FATAL EXCEPTION: main
01-17 20:37:28.101: ERROR/AndroidRuntime(358): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.content.view/com.content.view.MainActivity}: java.lang.NullPointerException
01-17 20:37:28.101: ERROR/AndroidRuntime(358): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): at android.os.Handler.dispatchMessage(Handler.java:99)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): at android.os.Looper.loop(Looper.java:123)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): at android.app.ActivityThread.main(ActivityThread.java:3647)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): at java.lang.reflect.Method.invokeNative(Native Method)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): at java.lang.reflect.Method.invoke(Method.java:507)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): at dalvik.system.NativeStart.main(Native Method)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): Caused by: java.lang.NullPointerException
01-17 20:37:28.101: ERROR/AndroidRuntime(358): at android.app.Activity.findViewById(Activity.java:1647)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): at com.content.view.MyView.<init>(MyView.java:15)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): at com.content.view.MainActivity.onCreate(MainActivity.java:29)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586)
01-17 20:37:28.101: ERROR/AndroidRuntime(358): ... 11 more
 
S

swordi

Lexikon
ben56a schrieb:
Ich glaube nicht, dass man mit der Exception etwas anfangen kann:
The Application "Applicationname" has stopped unexpectadly. Please try again.

Das mit der Klasse View habe ich bereits selbst gemerkt und auch schon behoben, daran liegt es aber nicht.
ja ganz sicher kann man mit den exceptions was anfangen. LOGCAT bitte - hellsehen kann ja leider niemand hier
 
B

ben56a

Ambitioniertes Mitglied
swordi schrieb:
ja ganz sicher kann man mit den exceptions was anfangen. LOGCAT bitte - hellsehen kann ja leider niemand hier
hatte bislang noch nicht das vergnügen mit logcat
 
A

Asfaloth

Fortgeschrittenes Mitglied
Korrekte Activity im Android Manifest angegeben?

Du hast ja den Namen von View auf was anderes geändert.
 
B

ben56a

Ambitioniertes Mitglied
Asfaloth schrieb:
Korrekte Activity im Android Manifest angegeben?

Du hast ja den Namen von View auf was anderes geändert.

dort habe ich die MainActivity angegeben:
Code:
 <activity android:name=".MainActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
 
S

swordi

Lexikon
du machst in deiner View klasse ein

findViewByID()

aber woher soll er wissen in welchem layout file er nachschauen soll.

deshalb NULL
und die nullPointerException

siehst du: Mit Logcat gehts besser ;)
 
B

ben56a

Ambitioniertes Mitglied
swordi schrieb:
du machst in deiner View klasse ein

findViewByID()

aber woher soll er wissen in welchem layout file er nachschauen soll.

deshalb NULL
und die nullPointerException

siehst du: Mit Logcat gehts besser ;)
Es scheint aber nicht zu genügen das setContentView(R.layout.main); in den Konstruktor der Klasse MyView zu packen.
 
S

swordi

Lexikon
ben56a schrieb:
Es scheint aber nicht zu genügen das setContentView(R.layout.main); in den Konstruktor der Klasse MyView zu packen.
noch immer der gleiche fehler?
 
B

ben56a

Ambitioniertes Mitglied
swordi schrieb:
noch immer der gleiche fehler?
01-17 21:01:51.381: ERROR/AndroidRuntime(531): FATAL EXCEPTION: main
01-17 21:01:51.381: ERROR/AndroidRuntime(531): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.content.view/com.content.view.MainActivity}: java.lang.NullPointerException
01-17 21:01:51.381: ERROR/AndroidRuntime(531): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622)
01-17 21:01:51.381: ERROR/AndroidRuntime(531): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
01-17 21:01:51.381: ERROR/AndroidRuntime(531): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
01-17 21:01:51.381: ERROR/AndroidRuntime(531): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
01-17 21:01:51.381: ERROR/AndroidRuntime(531): at android.os.Handler.dispatchMessage(Handler.java:99)
01-17 21:01:51.381: ERROR/AndroidRuntime(531): at android.os.Looper.loop(Looper.java:123)
01-17 21:01:51.381: ERROR/AndroidRuntime(531): at android.app.ActivityThread.main(ActivityThread.java:3647)
01-17 21:01:51.381: ERROR/AndroidRuntime(531): at java.lang.reflect.Method.invokeNative(Native Method)
01-17 21:01:51.381: ERROR/AndroidRuntime(531): at java.lang.reflect.Method.invoke(Method.java:507)
01-17 21:01:51.381: ERROR/AndroidRuntime(531): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-17 21:01:51.381: ERROR/AndroidRuntime(531): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-17 21:01:51.381: ERROR/AndroidRuntime(531): at dalvik.system.NativeStart.main(Native Method)
01-17 21:01:51.381: ERROR/AndroidRuntime(531): Caused by: java.lang.NullPointerException
01-17 21:01:51.381: ERROR/AndroidRuntime(531): at android.app.Activity.setContentView(Activity.java:1657)
01-17 21:01:51.381: ERROR/AndroidRuntime(531): at com.content.view.MyView.<init>(MyView.java:15)
01-17 21:01:51.381: ERROR/AndroidRuntime(531): at com.content.view.MainActivity.onCreate(MainActivity.java:26)
01-17 21:01:51.381: ERROR/AndroidRuntime(531): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-17 21:01:51.381: ERROR/AndroidRuntime(531): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586)
01-17 21:01:51.381: ERROR/AndroidRuntime(531): ... 11 more
01-17 21:01:51.412: WARN/ActivityManager(67): Force finishing activity com.content.view/.MainActivity
 
S

swordi

Lexikon
ist ein anderer - das setContenView dort macht wohl probleme

warum machst du eigentlich eine Activity in der Activity? was macht das für einen Sinn?
 
B

ben56a

Ambitioniertes Mitglied
swordi schrieb:
ist ein anderer - das setContenView dort macht wohl probleme

warum machst du eigentlich eine Activity in der Activity? was macht das für einen Sinn?
ich wollte wie oben geschrieben eine MVC Architektur umsetzen. Ich dachte mir, dass die MainActivity sozusagen die Main Funktion ist und ich dort den Controller, das Model und die View instanziiere. Schein aber wohl der falsche ansatz zu sein.
 
B

ben56a

Ambitioniertes Mitglied
ben56a schrieb:
ich wollte wie oben geschrieben eine MVC Architektur umsetzen. Ich dachte mir, dass die MainActivity sozusagen die Main Funktion ist und ich dort den Controller, das Model und die View instanziiere. Schein aber wohl der falsche ansatz zu sein.
Die Lösung meines Problems:

Code:
public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    
    private TextView tfEingabe;
    private TextView tfAusgabe;
    private Button butSend;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        setContentView(R.layout.main);
        this.tfEingabe = (TextView)findViewById(R.id.tfEingabe);
        this.tfAusgabe = (TextView)findViewById(R.id.tfAusgabe);
        this.butSend = (Button)findViewById(R.id.Button01);
        
        [U][B]Ausgabe a = new Ausgabe();
          Controller c = new Controller(a, this);[/B][/U]
   }
    public CharSequence getEingabe()
    {
        return this.tfEingabe.getText();
    }
    public void setEingabe(CharSequence input)
    {
        this.tfAusgabe.setText(input);
    }
    public void addActionListenerAusgabe(OnClickListener cl)
    {
        this.butSend.setOnClickListener(cl);
    }      
}
wobei es mich jetzt noch brennent interessieren würde, ob man das professionell in der praxis auch so umsetzt? ist mein lösungsansatz so gut?
 
T

ts-apps

Fortgeschrittenes Mitglied
Warum programmierst du nicht ermal "normal"?

Sorry aber man kann es sich auch unnötig schwer machen.
 
S

swordi

Lexikon
ts-apps schrieb:
Warum programmierst du nicht ermal "normal"?

Sorry aber man kann es sich auch unnötig schwer machen.

ich würde ein MVC pattern jetzt nicht als "abnormal" bezeichnen.
 
E

EqPO

Ambitioniertes Mitglied
Bleib bei MVC. Lieber ein schwerer und mühevoller Einstieg, aber eine gute Wartbarkeit, als ein schneller und Kraut- und Rübencode. :) Schlecht lesbaren Code gibt es genug. ;)

Flügelschweinpower with Tapatalk
 
S

swordi

Lexikon
ganz genau
 
Ähnliche Themen - Einfache Model View Controller Architektur Antworten Datum
0