1. Nimm jetzt an unserem AGM - Gewinnspiel teil - Informationen zum M1, A2 und A8 findest Du hier, hier und hier!
  1. ben56a, 17.01.2011 #1
    ben56a

    ben56a Threadstarter Android-Hilfe.de 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?
     
  2. swordi, 17.01.2011 #2
    swordi

    swordi Gewerbliches Mitglied

    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

    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

    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

    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

    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

    hatte bislang noch nicht das vergnügen mit logcat
     
  8. Asfaloth, 17.01.2011 #8
    Asfaloth

    Asfaloth Android-Hilfe.de Mitglied

    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


    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

    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

    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

    noch immer der gleiche fehler?
     
  13. ben56a, 17.01.2011 #13
    ben56a

    ben56a Threadstarter Android-Hilfe.de Mitglied

    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

    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

    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

    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

    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


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

    EqPO Android-Hilfe.de 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
     
  20. swordi, 20.01.2011 #20
    swordi

    swordi Gewerbliches Mitglied

    ganz genau