Андроид: сделать тест-приложение


Описание задач

Записаться на тест-программу, основываясь на теме, вы знакомы с!

Следующим требованиям

  • Есть как минимум четыре вопроса.

  • Следующие элементы управления используются хотя бы в одном тайме: кнопка, текстовое представление, полей EditText, чекбоксы, радиокнопки.

  • По крайней мере, один флажок-группа использует мульти-выбор.

  • Это надо представить-кнопка и кнопка сброса-кнопка, которая очищает все элементы управления.

A screenshot of my app in the Emulator

Вот мой исходный код на Java ...

package de.n_or.quizapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void startEvaluation(View view) {
        String[] answers = evaluateGui();

        int result = evaluateQuiz(answers);

        toastResult(result);
    }

    public String[] evaluateGui() {
        String[] ret = new String[5];
        EditText editTextQuestion1 = findViewById(R.id.question_1);

        CheckBox checkBoxQuestion2Greece = findViewById(R.id.question_2_Greece);
        CheckBox checkBoxQuestion2Burma = findViewById(R.id.question_2_Burma);
        CheckBox checkBoxQuestion2Luxembourg = findViewById(R.id.question_2_Luxembourg);

        Boolean answerQuestion2 = false;

        if (checkBoxQuestion2Greece.isChecked() == true && checkBoxQuestion2Burma.isChecked() == false && checkBoxQuestion2Luxembourg.isChecked() == true) {
            answerQuestion2 = true;
        }

        CheckBox checkBoxQuestion4Capital = findViewById(R.id.question_4_capital);
        CheckBox checkBoxQuestion4Hessia = findViewById(R.id.question_4_hessia);
        CheckBox checkBoxQuestion4Bavaria = findViewById(R.id.question_4_bavaria);

        Boolean answerQuestion4 = false;

        Boolean capital = checkBoxQuestion4Capital.isChecked();
        Boolean hessia = checkBoxQuestion4Hessia.isChecked();
        Boolean bavaria = checkBoxQuestion4Bavaria.isChecked();


        if (capital == false && hessia == false && bavaria == true) {
            answerQuestion4 = true;
        }

        ret[0] = editTextQuestion1.getText().toString().toLowerCase();
        ret[1] = Boolean.toString(answerQuestion2);
        ret[2] = evaluateRadioGroup(R.id.radio_group_question_3).toLowerCase();
        ret[3] = Boolean.toString(answerQuestion4);
        ret[4] = evaluateRadioGroup(R.id.radio_group_question_5).toLowerCase();

        return ret;
    }

    public int evaluateQuiz(String[] answers) {
        int result = 0;
        String[] correctAnswers = {"paris", "true", "south", "true", "germany"};

        for (int i = 0; i < correctAnswers.length; i++) {
            if (answers[i].equals(correctAnswers[i])) {
                result++;
            }
        }

        return result;
    }

    public void toastResult(int result) {
        String message = result + " out of 5. ";

        if (result == 0) {
            message += "Poor luck.";
        } else if (result == 1) {
            message += "You could do better.";
        } else if (result == 2) {
            message += "Quite nice.";
        } else if (result == 3) {
            message += "Really nice.";
        } else if (result == 4) {
            message += "Great!";
        } else if (result == 5) {
            message += "Absolutely awesome!";
        }

        Toast reportResult = Toast.makeText(getApplicationContext(), message,
                Toast.LENGTH_SHORT);
        reportResult.show();
    }

    private String evaluateRadioGroup(int id) {
        RadioGroup radioGroupQuestion;
        RadioButton radioButtonQuestion;

        radioGroupQuestion = findViewById(id);

        int radioButtonId = radioGroupQuestion.getCheckedRadioButtonId();
        radioButtonQuestion = findViewById(radioButtonId);

        if (radioButtonQuestion == null) {
            return "";
        }

        return (String)radioButtonQuestion.getText();
    }

    public void reset(View view) {
        EditText editText = findViewById(R.id.question_1);
        editText.setText("");

        CheckBox checkBox = findViewById(R.id.question_2_Greece);
        checkBox.setChecked(false);

        checkBox = findViewById(R.id.question_2_Burma);
        checkBox.setChecked(false);

        checkBox = findViewById(R.id.question_2_Luxembourg);
        checkBox.setChecked(false);

        RadioGroup radioGroup = findViewById(R.id.radio_group_question_3);
        radioGroup.clearCheck();

        checkBox = findViewById(R.id.question_4_capital);
        checkBox.setChecked(false);

        checkBox = findViewById(R.id.question_4_hessia);
        checkBox.setChecked(false);

        checkBox = findViewById(R.id.question_4_bavaria);
        checkBox.setChecked(false);

        radioGroup = findViewById(R.id.radio_group_question_5);
        radioGroup.clearCheck();
    }
}

XML для разметки ...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="de.n_or.quizapp.MainActivity">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="0dp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="4dp"
                android:text="@string/sub_header"
                android:textAlignment="center"
                android:textSize="22sp" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="12dp"
                android:layout_marginLeft="16dp"
                android:layout_marginTop="20dp"
                android:text="@string/question1"
                android:textSize="16sp" />

            <EditText
                android:id="@+id/question_1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="16dp" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="6dp"
                android:layout_marginLeft="16dp"
                android:layout_marginTop="20dp"
                android:text="@string/question2"
                android:textSize="16sp" />

            <CheckBox
                android:id="@+id/question_2_Greece"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="12dp"
                android:layout_marginLeft="16dp"
                android:layout_marginTop="0dp"
                android:text="@string/checkbox_greece" />

            <CheckBox
                android:id="@+id/question_2_Burma"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="12dp"
                android:layout_marginLeft="16dp"
                android:layout_marginTop="0dp"
                android:text="@string/checkbox_burma" />

            <CheckBox
                android:id="@+id/question_2_Luxembourg"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="12dp"
                android:layout_marginLeft="16dp"
                android:layout_marginTop="0dp"
                android:text="@string/checkbox_luxembourg" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="6dp"
                android:layout_marginLeft="16dp"
                android:layout_marginTop="20dp"
                android:text="@string/question3"
                android:textSize="16sp" />

            <RadioGroup
                android:id="@+id/radio_group_question_3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <RadioButton
                    android:id="@+id/question_3_north"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="0dp"
                    android:layout_marginLeft="16dp"
                    android:layout_marginTop="4dp"
                    android:text="@string/north" />

                <RadioButton
                    android:id="@+id/question_3_east"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="0dp"
                    android:layout_marginLeft="16dp"
                    android:layout_marginTop="2dp"
                    android:text="@string/east" />

                <RadioButton
                    android:id="@+id/question_3_south"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="0dp"
                    android:layout_marginLeft="16dp"
                    android:layout_marginTop="2dp"
                    android:text="@string/south" />

                <RadioButton
                    android:id="@+id/question_3_west"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="6dp"
                    android:layout_marginLeft="16dp"
                    android:layout_marginTop="2dp"
                    android:text="@string/west" />
            </RadioGroup>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="6dp"
                android:layout_marginLeft="16dp"
                android:layout_marginTop="20dp"
                android:text="@string/question4"
                android:textSize="16sp" />

            <CheckBox
                android:id="@+id/question_4_capital"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="12dp"
                android:layout_marginLeft="16dp"
                android:layout_marginTop="0dp"
                android:text="@string/munich_question_1" />

            <CheckBox
                android:id="@+id/question_4_bavaria"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="12dp"
                android:layout_marginLeft="16dp"
                android:layout_marginTop="0dp"
                android:text="@string/munich_question_3" />

            <CheckBox
                android:id="@+id/question_4_hessia"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="12dp"
                android:layout_marginLeft="16dp"
                android:layout_marginTop="0dp"
                android:text="@string/munich_question_2" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="6dp"
                android:layout_marginLeft="16dp"
                android:layout_marginTop="20dp"
                android:text="@string/question5"
                android:textSize="16sp" />

            <RadioGroup
                android:id="@+id/radio_group_question_5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <RadioButton
                    android:id="@+id/question_5_germany"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="0dp"
                    android:layout_marginLeft="16dp"
                    android:layout_marginTop="4dp"
                    android:text="@string/germany" />

                <RadioButton
                    android:id="@+id/question_5_poland"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="0dp"
                    android:layout_marginLeft="16dp"
                    android:layout_marginTop="2dp"
                    android:text="@string/poland" />

                <RadioButton
                    android:id="@+id/question_5_denmark"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="22dp"
                    android:layout_marginLeft="16dp"
                    android:layout_marginTop="2dp"
                    android:text="@string/denmark" />
            </RadioGroup>

            <Button
                android:id="@+id/evaluate"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="22dp"
                android:layout_marginLeft="16dp"
                android:layout_marginRight="16dp"
                android:onClick="startEvaluation"
                android:text="@string/evaluate_button" />

            <Button
                android:id="@+id/reset"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="16dp"
                android:layout_marginRight="16dp"
                android:onClick="reset"
                android:text="@string/reset_button"
                android:textColor="#ff0033"
                android:textStyle="bold" />

        </LinearLayout>
    </ScrollView>

</LinearLayout>

Гиперссылка на мой гитхаб-репозиторий.

Что бы ты сделал по-другому и почему?

Жду с нетерпением комментариев и ответов.



5771
2
задан 25 февраля 2018 в 02:02 Источник Поделиться
Комментарии
1 ответ

прям как: не использовать объектно ориентированное программирование! такой ответ говорит лишь о том, как использовать объекты


ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС / В XML

Я бы посоветовал вам разделить ваш макет на разных суб-макеты, так что вы можете повторно использовать схемы. таким образом, вы можете легко расширить ваше приложение в будущем.

Код

Я думаю, что это будет хорошая идея, чтобы использовать Question-объекта. Может быть, вы могли бы создавать фабрики, которые создают эти объекты для вас - просто думаю о нем?

Question capitals = questionFactory.createQuestion(
QuestionType.MultiChoice,
new boolean[]{true, false, true},
new int[]{R.string.question_2_Greece,
R.string.question_2_Burma,
R.string.question_2_Luxembourg}
);

что бы сделать его легким для вас, чтобы создать какие-то новые вопросы в простой форме. И если вы не знаете, как это сделать, что вы можете по крайней мере написать простые методы для создания Question-объекты Question question = createQuestion(...);

и после этого было бы легко использовать это Question-объект, макет, макет добавить динамичные, не жестко в XML-макета.

View view = findViewById(R.id.scrollview); //FIXME set an ID in your layout
View multiChoiceView = createMultiChoiceView(capitals);
view.addView(multiChoiceView);

вы можете таким образом создать sublayout programmatical, если вы используете насос

View multiChoiceView = View.inflate(context, multiChoiceView, yourLinearLayout);

когда вы создать макет вы можете 'на лету' набор ценностей и привязать интерфейс к модели. (см. Это объяснение разных подходов на модель/вид)

и как только это сделано, вы можете легко добраться до ваших результатов. Результаты должны быть представлены как объект, не String[]как сделать в evaluateGui. Таким образом вы злоупотребляете строку [], чтобы представить свои результаты.

private List<Question> questions = ... //see above
private Result validateQuestions(){
Result result = new Result();
for (Question question: questions){
result.addScores(question.getScores());
}
return result;
}

для проверки результата можно использовать перечислимый тип, а не подсчет очков.

enum Rating {POOR, MEDICRATE, GOOD, PERFECT};//TODO make a nice toString

public void toastResult(Result result) {
int scores = result.getScores();
int amount = result.getAmountQuestions();
Rating rating = result.getRating();

String message = MessageFormat.format("you had {0} of {1} - your rating is {2}", scores, amount, rating);
Toast.makeText(getApplicationContext(), message,
Toast.LENGTH_SHORT).show();

1
ответ дан 28 февраля 2018 в 05:02 Источник Поделиться