Трех полей EditText коробки: предложений, чтобы очистить код


Я новичок в написании приложений для Андроида и использовании Java в целом. Я прошел через большинство Android привет смотреть учебники, но по-прежнему не хватает понимания основ. Вот фрагмент кода, который я написал для себя приложение. Моей целью было иметь три коробки EditText для ввода информации. Я хочу, чтобы пользователь, чтобы разместить информацию в двух из трех полей, и когда они нажмите кнопку "вычислить", он будет вычислить третье значение полей EditText на основе определенного уравнения. Есть в любом случае, что я могу избежать инициализации этих 3 объектов полей EditText в каждой из моих методов в этом классе? Любые другие предложения по очистке или улучшить этот код?

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();
        }
    }
}


1537
3
задан 11 ноября 2011 в 03:11 Источник Поделиться
Комментарии
5 ответов

Объявить и инициализировать редактировать тексты вроде этого:

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);

.....

Теперь вам не нужно будет повторно объявить и инициализировать их в другие методы, а именно метод Calc в этом примере.

Надеюсь, что помогает,
Бэрри

2
ответ дан 11 ноября 2011 в 03:11 Источник Поделиться


  • Заменить "43560*144" постоянным.

  • Магазин новый двойной(СС), новые двойные(СРС), новый двойной(поп) в переменных
    перед Если (checkifempty(коробки) <2). Это повысит скорость и ясность
    код.

  • Правильное углубление в метод onCreate способ

3
ответ дан 11 ноября 2011 в 03:11 Источник Поделиться

Заменить ужасные checkIfEmpty способ, который кстати делает не то, что вы планируете это делать. Использовать addTextChangedListener для EditTexts.
В вашем XML-файле, установить свойство для Android:текст в пустое значение, так что вы можете избежать делать это в коде.

3
ответ дан 11 ноября 2011 в 03:11 Источник Поделиться

Некоторые общие (Ява) идея без каких-либо конкретных Андроид вещи:

1, распакуйте сделать*дистанционирование методов, например:

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

Он удаляет некоторые дублирования кода.

2, рекомендуется использовать я++ вместо Я = Я+1.

3, использовать длинные имена:

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

Это делает код более читаемым.

2, переименовать checkifempty способ. Он ничего не проверить, она возвращает количество пустых полей. Поэтому для текущей функциональности она должна быть countEmptyFields или что-то подобное. В любом случае, я бы написал следующее:

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();
}

затем в известково способ:

...
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("")) ...
...

В showError удаляет дублирование кода а == 0 и > 2 проверяет в начале заменяет вложенные блоки, чтобы легче следить за структурой.

3
ответ дан 13 ноября 2011 в 11:11 Источник Поделиться

Использовать Andject, чтобы избавиться от чего-то = getViewById():

https://github.com/ko5tik/andject

( Shameles само-реклама )

Speciofy необходимый вид через Примечания:

  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;

}

И в вашем методе onCreate() сказать:

  ViewInjector.startActivity(injectable);

Там тоже работают undeway, чтобы придать общей предпочтения ценностей ( также обеспечивает более чистый код и декларативный стиль )

2
ответ дан 11 ноября 2011 в 03:11 Источник Поделиться