Какой быстрый способ назначить кнопки в цикле в начале упражнения? - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть фрагмент кода, который вызывается в начале onCreate() (5-я строка после super.onCreate) в моей основной деятельности, и я подозреваю, что это замедляет запуск (и отладку).

Это цикл, используемый для назначения 10 кнопок и прослушивателей Click для каждой из них. Вот фрагмент кода:

//expostate is a boolean and is always false at start of activity
//checkLength(Screen) will always return true at start of activity
//expression is of String data type
//Screen is a TextView

for(int i=0; i<10; i++){
            String btnid = "btn" + i;
            int resourceid = getResources().getIdentifier(btnid, "id", getPackageName());
            numbuttons[i] = findViewById(resourceid);
            final String value =  String.valueOf(i);
            numbuttons[i].setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (checkLength(Screen) && !expostate) {
                        if (expression.equals("0")) {
                            expression = "";
                            Screen.setText("");
                        }
                        Screen.append(value);
                        expression += value;
                        presentop = false;
                    }
                    else if (checkLength(Screen) && expostate) {
                        if (expression.equals("0")) { 
                            expression = "";
                            Screen.setText("");
                        }
                        Screen.append(getSuperscript(value));
                        expression += value;
                        presentop = false;
                    }
                }
            });
        }

Есть ли лучший / более быстрый способ решения этой же задачи?

Ответы [ 3 ]

1 голос
/ 30 сентября 2019

Улучшение, которое я бы предложил, - метод onClick(). Ваша логика может быть написана так:

public void onClick(View view) {
    if (expression.equals("0")) {
        expression = "";
        Screen.setText("");
    }

    if (checkLength(Screen)) Screen.append(expostate ? getSuperscript(value) : value);

    expression += value;
    presentop = false;
}
0 голосов
/ 30 сентября 2019

Итак, я обнаружил, что менее дерзкий способ сделать это - присвоить android:onClick каждой из 10 кнопок вместе с android:tag для извлечения значения.

Код: -

public void onNumpress(View v){
        buttonFlash((Button) v);
        String value = getResources().getResourceEntryName(v.getId()).replace("btn", "");
        if (expression.equals("0")) {
            expression = "";
            Screen.setText("");
        }
        if (checkLength(Screen)) Screen.append(expostate ? getSuperscript(value) : value);
        expression += value;
        presentop = false;
    }

XML-макет одной из кнопок: -

    <Button
        android:id="@+id/btn0"
        android:layout_width="78dp"
        android:layout_height="85dp"
        android:layout_marginBottom="8dp"
        android:background="@color/colorPrimary"
        android:text="@string/btn0"
        android:textColor="@color/colorSecondary"
        android:textSize="24sp"
        android:onClick="onNumpress"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/btnans" />
0 голосов
/ 30 сентября 2019

Если идентификаторы кнопок известны во время выполнения, вам лучше создать массив с идентификаторами вместо вызова getResources ().

...