1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Einfache Model View Controller Architektur

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von ben56a, 17.01.2011.

  1. ben56a, 17.01.2011 #1
    ben56a

    ben56a Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    91
    Erhaltene Danke:
    0
    Registriert seit:
    15.08.2010
    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?
     
  2. swordi, 17.01.2011 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    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.
     
  3. ben56a, 17.01.2011 #3
    ben56a

    ben56a Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    91
    Erhaltene Danke:
    0
    Registriert seit:
    15.08.2010
    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.
     
  4. Asfaloth, 17.01.2011 #4
    Asfaloth

    Asfaloth Android-Hilfe.de Mitglied

    Beiträge:
    113
    Erhaltene Danke:
    4
    Registriert seit:
    13.12.2009
    Phone:
    LG Optimus Speed
    Ich glaube swordi meinte eher den LogCat Log. Den solltest du kopieren ;)
     
  5. ben56a, 17.01.2011 #5
    ben56a

    ben56a Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    91
    Erhaltene Danke:
    0
    Registriert seit:
    15.08.2010
    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
     
  6. swordi, 17.01.2011 #6
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    ja ganz sicher kann man mit den exceptions was anfangen. LOGCAT bitte - hellsehen kann ja leider niemand hier
     
  7. ben56a, 17.01.2011 #7
    ben56a

    ben56a Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    91
    Erhaltene Danke:
    0
    Registriert seit:
    15.08.2010
    hatte bislang noch nicht das vergnügen mit logcat
     
  8. Asfaloth, 17.01.2011 #8
    Asfaloth

    Asfaloth Android-Hilfe.de Mitglied

    Beiträge:
    113
    Erhaltene Danke:
    4
    Registriert seit:
    13.12.2009
    Phone:
    LG Optimus Speed
    Korrekte Activity im Android Manifest angegeben?

    Du hast ja den Namen von View auf was anderes geändert.
     
  9. ben56a, 17.01.2011 #9
    ben56a

    ben56a Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    91
    Erhaltene Danke:
    0
    Registriert seit:
    15.08.2010

    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>
    
     
  10. swordi, 17.01.2011 #10
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    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 ;)
     
  11. ben56a, 17.01.2011 #11
    ben56a

    ben56a Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    91
    Erhaltene Danke:
    0
    Registriert seit:
    15.08.2010
    Es scheint aber nicht zu genügen das setContentView(R.layout.main); in den Konstruktor der Klasse MyView zu packen.
     
  12. swordi, 17.01.2011 #12
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    noch immer der gleiche fehler?
     
  13. ben56a, 17.01.2011 #13
    ben56a

    ben56a Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    91
    Erhaltene Danke:
    0
    Registriert seit:
    15.08.2010
    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
     
  14. swordi, 17.01.2011 #14
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    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?
     
  15. ben56a, 17.01.2011 #15
    ben56a

    ben56a Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    91
    Erhaltene Danke:
    0
    Registriert seit:
    15.08.2010
    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.
     
  16. ben56a, 17.01.2011 #16
    ben56a

    ben56a Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    91
    Erhaltene Danke:
    0
    Registriert seit:
    15.08.2010
    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?
     
  17. ts-apps, 17.01.2011 #17
    ts-apps

    ts-apps Erfahrener Benutzer

    Beiträge:
    194
    Erhaltene Danke:
    39
    Registriert seit:
    27.03.2010
    Warum programmierst du nicht ermal "normal"?

    Sorry aber man kann es sich auch unnötig schwer machen.
     
  18. swordi, 18.01.2011 #18
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009

    ich würde ein MVC pattern jetzt nicht als "abnormal" bezeichnen.
     
  19. EqPO, 20.01.2011 #19
    EqPO

    EqPO Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    2
    Registriert seit:
    11.03.2010
    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
     
  20. swordi, 20.01.2011 #20
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    ganz genau
     

Diese Seite empfehlen