Einfache Model View Controller Architektur

B

ben56a

Ambitioniertes Mitglied
0
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?
 
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.
 
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.
 
Ich glaube swordi meinte eher den LogCat Log. Den solltest du kopieren ;)
 
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
 
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
 
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
 
Korrekte Activity im Android Manifest angegeben?

Du hast ja den Namen von View auf was anderes geändert.
 
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>
 
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 ;)
 
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.
 
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?
 
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
 
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?
 
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.
 
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?
 
Warum programmierst du nicht ermal "normal"?

Sorry aber man kann es sich auch unnötig schwer machen.
 
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.
 
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
 
ganz genau
 

Ähnliche Themen

R
  • Gesperrt
  • roland-senior
Antworten
2
Aufrufe
789
Fulano
Fulano
wernho
Antworten
11
Aufrufe
599
wernho
wernho
S
  • softwareunkundig
Antworten
1
Aufrufe
878
jogimuc
J
Zurück
Oben Unten