Drei Edittext-Felder: Vorschläge zum Bereinigen von Code

  • Ich bin ein Neuling im Schreiben von Android-Apps und im Allgemeinen mit Java. Ich habe die meisten Android-Anleitungen zur Hello-Ansicht durchlaufen, aber es scheint mir immer noch ein wenig Verständnis für die Grundlagen zu geben. Hier ist ein Codeausschnitt, den ich für eine App geschrieben habe. Mein Ziel war es, drei Edittext-Felder zur Eingabe von Informationen zu haben. Ich möchte, dass der Benutzer Informationen in zwei der drei Felder einfügt. Wenn Sie auf die Schaltfläche "Berechnen" klicken, wird der dritte Edittext-Wert anhand einer bestimmten Gleichung berechnet. Gibt es auf jeden Fall, dass ich es vermeiden kann, diese 3 Edittext-Objekte in jeder meiner Methoden innerhalb dieser Klasse zu initialisieren? Weitere Vorschläge zum Bereinigen oder Verbessern dieses Codes?

     public class PlantPopulation extends Activity {
    
        /** Called when the activity is first created. */    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            EditText seedSpacing = (EditText) 
                    findViewById(R.id.seedSpacing);
            EditText rowSpacing = (EditText) 
                    findViewById(R.id.rowSpacing);
            EditText population = (EditText) 
                    findViewById(R.id.population);
    
            seedSpacing.setText("");  //clear values
            rowSpacing.setText("");
            population.setText("");
    
        }
    
        //check how many boxes are empty
        public int checkifempty(String array[]) {
    
            int i = 0;
            for (String string : array) {
                if (string.equals("")) {
                    i = i+1;
                }   
            }
            return i;
        }
    
        //run the calculation
        public void calc(View v) {  
    
            EditText seedSpacing = (EditText) 
                    findViewById(R.id.seedSpacing);
            EditText rowSpacing = (EditText) 
                    findViewById(R.id.rowSpacing);
            EditText population = (EditText) 
                    findViewById(R.id.population);
    
            String sS = seedSpacing.getText().toString();
            String rS = rowSpacing.getText().toString();
            String pop = population.getText().toString();
    
            String boxes[] = {sS,rS,pop}; 
            //determine which box is empty
            if (checkifempty(boxes) <2) {
    
                if (sS.equals("")) {
                    double calc1=(43560*144)/new Double(rS)/
                            new Double(pop);
                    calc1 = Math.floor(calc1 * 100 +.5)/100;
                    seedSpacing.setText(Double.toString(calc1));
                } else if (rS.equals("")) {
                    double calc2=(43560*144)/new Double(sS)/
                            new Double(pop);
                    calc2 = Math.round(calc2);
                    rowSpacing.setText(Double.toString(calc2));
                } else if (pop.equals(""))  {
                    Double calc3=((43560*144)/new Double(rS)/
                            new Double(sS));
                    Integer calc = calc3.intValue();
                    //calc3 = Math.round(calc3);
                    population.setText(calc.toString());
                } else {
                    Toast.makeText(PlantPopulation.this, 
                        "Leave one item blank.", Toast.LENGTH_SHORT).show();
                }   
            } else {
                Toast.makeText(PlantPopulation.this, 
                        "You must fill in two of the three boxes.", Toast.LENGTH_SHORT).show();
            }
        }
    }
     
    09 June 2012
    palacsintScott S
5 answers
    • Ersetzen Sie "43560 * 144" durch eine Konstante.
    • Speichern Sie new Double(sS), new Double(srS), new Double(pop) in Variablen vor if (checkifempty(boxes) <2). Dadurch wird die Geschwindigkeit verbessert und der Code erläutert.
    • Korrigieren Sie die Einrückung in der onCreate -Methode
    11 November 2011
  • Ersetzen Sie die schreckliche checkIfEmpty -Methode, die übrigens nicht das tut, was Sie vorhaben. Verwenden Sie addTextChangedListener für Ihre EditTexts.
    Setzen Sie in Ihrer XML-Datei die Eigenschaft android:text auf einen leeren Wert, damit Sie dies im Code vermeiden können.

    11 November 2011
    Maggie
  • Einige allgemeine (Java) Ideen ohne Android-spezifische Informationen:

    1, Extrahieren Sie die Methoden get*Spacing, zum Beispiel:

     publiv EditText getSeedSpacing() {
        return (EditText) findViewById(R.id.seedSpacing);
    }
     

    Es entfernt einige Code-Duplikate.

    2, Erwägen Sie die Verwendung von i++ anstelle von i = i+1.

    3, Verwenden Sie längere Namen:

     String seedSpacingValue = seedSpacing.getText().toString();
    String rowSpacingValue = rowSpacing.getText().toString();
    String populationValue = population.getText().toString();
     

    Dadurch wird der Code lesbarer.

    2, Benennen Sie die Methode checkifempty um. Es prüft nichts, es gibt die Anzahl der leeren Felder zurück. Für die aktuelle Funktionalität sollte es also countEmptyFields oder etwas ähnliches sein. Jedenfalls würde ich folgendes schreiben:

     public int countEmptyFields(final EditText... fields) {
        int count = 0;
        for (EditText field: fields) {
            final String value = field.getText();
            if ("".equals(value)) {
                count++
            }   
        }
        return count;
    }
    
    public void showError(final String msg) {
        Toast.makeText(PlantPopulation.this, msg, Toast.LENGTH_SHORT).show();
    }
     

    dann in der Methode calc:

     ...
    final int emptyFields = countEmptyFields(seedSpacing, rowSpacing, population);  
    if (emptyFields == 0) {
        showError("Leave one item blank.");
        return;
    }
    if (emptyFields > 2) {
        showError("You must fill in two of the three boxes.");
        return;
    }
    if (seedSpacingValue.equals("")) ...
    ...
     

    Das showError entfernt einige Code-Duplikationen, während die == 0 und > 2 am Anfang die verschachtelten Blöcke ersetzen zu einer leichter zu verfolgenden Struktur.

    14 November 2011
    palacsintScott S
  • Verwenden Sie Andject, um etwas loszuwerden = getViewById ():

    https://github.com/ko5tik/andject

    (Shameles selbst werbend)

    Speziell gewünschte Ansichten über Anmerkungen:

       class WithInjectableViews extends Activity {
        // shall be injected
        @InjectView(id = 239)
        private android.view.View asView;
        @InjectView(id = 555)
        private Button button;
        // shall be left alone
        private View notInjected = null;
    
    }
     

    Und in Ihrem onCreate () sagen Sie:

       ViewInjector.startActivity(injectable);
     

    Darüber hinaus können Sie gemeinsame Präferenzwerte einfügen (auch sauberer Code und deklarativer Stil)

    11 November 2011
    markgx
  • Deklarieren und initialisieren Sie die Bearbeitungstexte folgendermaßen:

     public class PlantPopulation extends Activity {
        EditText seedSpacing;
        EditText rowSpacing;
        EditText population;
    
    /** Called when the activity is first created. */    
        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        seedSpacing = (EditText) 
                findViewById(R.id.seedSpacing);
        rowSpacing = (EditText) 
                findViewById(R.id.rowSpacing);
        population = (EditText) 
                findViewById(R.id.population);
    
    .....
     

    Sie werden es jetzt nicht brauchen Deklarieren und initialisieren Sie sie in anderen Methoden, in diesem Beispiel mit Ihrer Calc-Methode.

    Ich hoffe, das hilft, Barry

    11 November 2011
    Corey Trager