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

Meine erste App :)

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von dbaf14, 24.05.2010.

  1. dbaf14, 24.05.2010 #1
    dbaf14

    dbaf14 Threadstarter Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    23
    Registriert seit:
    11.07.2009
    So Leute hab mich mal hingesetzt und es in einem Zug vollbracht!!

    hab zwar bis jetzt weder ein Buch gelesen noch mich langfristig irgendwo im Netz eingelesen aber es funktioniert!!
    Das ist ein Schaltplan den ein kumpel (DJ) von mir für seine Lichttechnik gut gebrauchen kann!

    Ich weiß es ist total uneffizient und durcheinander geschrieben aber dennoch wollte ich mal erfragen wie ich es mir hätte einfacher machen können ?
    v----- lol sogar nen schreibfehler :D
    [​IMG]
    hab mal Alles hochgeladen^^

    >>>Schaltplan-APK<<<

    >>>Schaltplan - Source<<<

    ..und ein Danke an die wenigen , die mir wenigstens ein paar Hinweise gegeben haben ^_^

    mfg dbaf14
     
  2. badboy_, 24.05.2010 #2
    badboy_

    badboy_ Gast

    ohne jetzt Java- geschweige denn Android-Kenntnisse zu haben, kann ich aus meiner Programmiererfahrung sagen: DRY! (Don't repeat yourself!)

    Du hast da 24 Mal dieses "findViewById(R.id.ButtonXX)...".
    Das kann man bestimmt als einfache Schleife verpacken und spart sich somit 23 der 24 Codeschnippsel.
     
  3. Fr4gg0r, 24.05.2010 #3
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    Nein, das ist nicht dynamisch ansprechbar.

    Btw:
    Du packst jedes findViewById(); in einen Block, und packst diesen Block dann noch in den darübergestellten Block. :confused::confused:
    Die ganzen Klammern sind echt absolut sinnlos.
    Das zweite:
    Ich würde nicht tausend verschiedene onClickListeneres erstellen, sondern nur einen (was bestimmt auch performanter ist):
    Code:
    OnClickListener onclick = new OnClickListener(){
       public void onClick(View v){
          int id = v.getId();
          switch(id){
          case R.id.button1: //mach iwas break;
          case R.id.button2:   ... break;
    .
    .
    .
          }
       }
    };
    findViewById(R.id.button1).setOnClickListener(onclick);
    .
    .
    .
    
    Was das Programm macht hab ich jetzt aber nicht verstanden. :confused:
     
    Zuletzt bearbeitet: 24.05.2010
  4. dbaf14, 24.05.2010 #4
    dbaf14

    dbaf14 Threadstarter Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    23
    Registriert seit:
    11.07.2009
    Das sind binomische zahlen ,und damit er da im Stress nicht ewig überlegen muss ist so ne app denke ich mal ganz praktisch!

    Klar hätte man das noch in zig anderen Varianten schreiben können. .aber so weit bin ich halt noch nicht. :)

    Danke für die Tipps!

    Mfg

    edit: cool danke . mit nur einem OnClickListener ist das zudem viel übersichtlicher.
     
    Zuletzt bearbeitet: 24.05.2010
  5. Fr4gg0r, 26.05.2010 #5
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    So, habs jetzt auch geschafft die App aufm Emu zu installiere - lmao, hatte die ganze zeit mit adb push gekämpft, statt install zu nehmen.
    Jedes mal einen Intent starten und somit auch immer alles neuzeichnen ist stark suboptimal mMn.
    Stattdessen solltest du bei jedem Klick lediglich die Zahlen unten ändern...
     
  6. Scogit, 27.05.2010 #6
    Scogit

    Scogit Android-Hilfe.de Mitglied

    Beiträge:
    69
    Erhaltene Danke:
    2
    Registriert seit:
    16.08.2009
    Phone:
    Samsung Galaxy
    Da wäre ich mir gar nicht mal so sicher bei 3-4 Button's bestimmt aber je mehr unterschiedliche OnClick-Events du hast desto unübersichtlicher wird der Listener und du hast jedes mal toten Code ob das jetzt was macht weis ich nicht kann ich in Java leider noch nicht so beurteilen... hast du mal ein Profiling gemacht?

    Eines ist jedoch klar schön ist keine beiden Lösungen.
     
  7. Fr4gg0r, 27.05.2010 #7
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    Ja hast recht, schneller ist es wohl 30 verschiedene Listener zu haben.
    Einen zu haben sollte jedoch weniger Speicher brauchen denk ich mal und auch weniger Initialisierungszeit benötigen?
     
  8. the_alien, 27.05.2010 #8
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Hätte mir den Code jetzt auch angeguckt, allerdings kann man den von Rapidshare nichtmehr runterladen...
     
  9. MichaelS, 27.05.2010 #9
    MichaelS

    MichaelS Fortgeschrittenes Mitglied

    Beiträge:
    370
    Erhaltene Danke:
    51
    Registriert seit:
    14.08.2009
    saubere programmierung ist das aber nicht 20 mal den gleichen listener auf zu setzen... man sollte seine methoden logisch aufbauen, dass man sie so oft wie möglich und logisch machbar ist benutzen kann. ich würde an der stelle allein wegen dem code style und der übersichtlichkeit auch nur 1 listener nutzen und den strukturiert ordentlich aufbauen... vorallem, wenn nur ne zahl angepasst wird also bitte.. naja jeder wie er mag ;) bei mir würde sowas nicht durchgehen =)
     
  10. the_alien, 27.05.2010 #10
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Ich würde ja gerne mitreden anhand des codes, aber den hab ich nicht. Aber zu den Listenern:
    Wenn man 20 mal per Copy & Paste einen Listener anhängt ist das schlecht. Wenn man genau ein Listener Objekt erstellt und das überall dranhängt und dann per switch case irgendetwas abfragt, ist das genauso schlecht. Solche Listener sehe ich hier auf der Arbeit zu Hauf und der Code macht ständig Probleme und man weiss nie was wofür ist.
    Dann sollte man eine Methode haben die eben jenen Listener, der sonst 20 mal deklariert wird, beinhaltet und ein neues Objekt davon zurück gibt. Alles andere würde bei mir nicht durchgehen ;)
     
  11. Scogit, 27.05.2010 #11
    Scogit

    Scogit Android-Hilfe.de Mitglied

    Beiträge:
    69
    Erhaltene Danke:
    2
    Registriert seit:
    16.08.2009
    Phone:
    Samsung Galaxy
    Ich hab leider keinen Beispielscode zur Hand aber mich würde das Profiling interesieren.

    Traceview: A Graphical Log Viewer | Android Developers
     
  12. dbaf14, 27.05.2010 #12
    dbaf14

    dbaf14 Threadstarter Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    23
    Registriert seit:
    11.07.2009
    So hab nochmal alles hochgeladen :)

    mirror 1

    mirror 2

    leute ich muss echt sagen, echt klasse dass hier so viele informationen und hinweise zusammen kommen,, wenn ich danach selber rumhandtiere macht es am laufenden band klick klick klick klick bei mir im turm :D

    einfache beispiele wären die krönung ^^
    aber man kann ja nich alles haben!


    mfg dbaf14
     
  13. the_alien, 27.05.2010 #13
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Was ich meine ist, man könnte statt ständig eine neue anonyme Klasse zu machen, die sowieso ewig das gleiche tut das alles in eine Methode auslagern:
    Code:
    private OnClickListener getListener(final Context context, final Class clazz) {
    		return new View.OnClickListener() {
    	        public void onClick(View v){ 
               	    Intent schaltplan1 = new Intent(context, clazz);
      				startActivity(schaltplan1);
            		finish();
     	         }
        	};
    	}
    
    Dann kann man den Listener ganz einfach so anhängen:
    Code:
    findViewById(R.id.Button01).setOnClickListener(getListener(this, schaltplan1.class));
    
    Das alles ist aber total unnütz wenn du eh nur ein paar Zahlen unten änderst. Da solltest du dir unten einen TextView machen wo du je nach Button einen String einsetzt. Dann könnte die onCreate Methode so in etwa aussehen:

    Code:
    public class Schaltplan extends Activity {
    	
    	private OnClickListener getListener(int stringNummer) {
    		return new View.OnClickListener() {
    	        public void onClick(View v){ 
               	    findViewById(R.id.TextView01).setText(strings[i]);
     	         }
        	};
    	}
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            
            setContentView(R.layout.main);
           
            findViewById(R.id.Button01).setOnClickListener(getListener(0));
            findViewById(R.id.Button01).setOnClickListener(getListener(1));
            findViewById(R.id.Button01).setOnClickListener(getListener(2));
            findViewById(R.id.Button01).setOnClickListener(getListener(3));
            findViewById(R.id.Button01).setOnClickListener(getListener(4));
            findViewById(R.id.Button01).setOnClickListener(getListener(5));
            findViewById(R.id.Button01).setOnClickListener(getListener(6));
            findViewById(R.id.Button01).setOnClickListener(getListener(7));
            findViewById(R.id.Button01).setOnClickListener(getListener(8));
            findViewById(R.id.Button01).setOnClickListener(getListener(9));
            findViewById(R.id.Button01).setOnClickListener(getListener(10));
            findViewById(R.id.Button01).setOnClickListener(getListener(11));
            findViewById(R.id.Button01).setOnClickListener(getListener(12));
            findViewById(R.id.Button01).setOnClickListener(getListener(13));
            findViewById(R.id.Button01).setOnClickListener(getListener(14));
            findViewById(R.id.Button01).setOnClickListener(getListener(15));
            findViewById(R.id.Button01).setOnClickListener(getListener(16));
            findViewById(R.id.Button01).setOnClickListener(getListener(17));
            findViewById(R.id.Button01).setOnClickListener(getListener(18));
            findViewById(R.id.Button01).setOnClickListener(getListener(19));
            findViewById(R.id.Button01).setOnClickListener(getListener(20));
            findViewById(R.id.Button01).setOnClickListener(getListener(21));
            findViewById(R.id.Button01).setOnClickListener(getListener(22));
            findViewById(R.id.Button01).setOnClickListener(getListener(23));
                
        }
    }
    Du musst natürlich noch das Stringarray "strings" anlegen und alle deine 24 Strings dort reinlegen. Aber somit hast du dir 24 Klassen x 24 Listener erspart plus 23 Listener in diese Klasse. Macht insgesamt 599 kompilierte .class Dateien weniger! Man mag hier argumentieren wie man möchte mit Listenern, aber 599 ist Fakt.

    Wenn du das ganze so machst fallen auch 24 Layouts weg...

    PS: Es ist nur eine Konvention und kein Muss... aber Klassen schreibt man mit einem Großbuchstaben am Anfang!
    PPS: Nicht meckern wenns nicht kompiliert, ich habs nur schnell im Browser ins Unreine geschrieben. Ich hoffe es hilft.
    PPPS: Glatt nen Riesenfehler im Code gefunden und korrigiert ;)
     
    Zuletzt bearbeitet: 27.05.2010

Diese Seite empfehlen