从当前位置向后循环数组

时间:2017-12-07 11:48:39

标签: java android

我是java和android的新手所以请耐心等待我。我有一个包含两个按钮的xml布局。一个包含“previous”和另一个“next”的文本。我还有一个包含字符串数组的类,当点击“下一步”按钮时,它会在textView中按升序循环。

我想要的是,当单击“上一个”按钮时,我希望数组从当前位置向后循环。有什么想法吗?

问题类

// This file contains questions from QuestionBank
class Question{
    // array of questions
    private String mQuestions [] = {
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
    // method returns number of questions
    int getLength(){
        return mQuestions.length;
    }

    // method returns question from array textQuestions[] based on array index
    String getQuestion(int a) {
        return mQuestions[a];
    }
}

主要Activity.java

     public class MainActivityextends AppCompatActivity {
                private QuestionLibraryBeginner mQuestionLibrary = new QuestionLibraryBeginner();
                private int mQuestionNumber = 1; // current question number
            //initialising navigation buttons
                private Button mPrevious;
                private Button mNext;
            private TextView mQuestionText;
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_beginner_review);
                    mPrevious = (Button) findViewById(R.id.previous);
                    mNext = (Button) findViewById(R.id.next);
  mQuestionText = (TextView) findViewById(R.id.txtQuestion);
                    // receive the current question number from last activity by Intent


        Intent intent = getIntent();
             currentQuestionNumber = intent.getIntExtra("quizNumber", 0); // receiving the number of questions the user has attempted from previous activity
                    mNext.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
    // checking against total number of questions the user has attempted instead of total number of questions from Question Class
    if (mQuestionNumber < currentQuestionNumber) {
             updateQuestion();
                        }
                    });
                    mPrevious.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
            // i want it to loop backwards from here
                        }
                    });

            // logic to update question from array
                private void updateQuestion() {
                    if (mQuestionNumber < mQuestionLibrary.getLength()) {
                        mQuestionText.setText(mQuestionLibrary.getQuestion(mQuestionNumber));
                        mQuestionNumber++;
                    }
                }

            }

5 个答案:

答案 0 :(得分:0)

我建议这样做:

1)将updateQuestion方法重命名为nextQuestion

2)创建一个减少mQuestionNumber的方法,如下所示:

private void prevQuestion(){
    if(mQuestionNumber > 0){
    mQuestionText.setText(mQuestionLibrary.getQuestion(mQuestionNumber));
    mQuestionNumber--;}
}

答案 1 :(得分:0)

我会改变以下方法:

将删除mQuestionNummer ++;来自更新问题。

您可以直接在NextButton的onClickMethode中增加mQuestions。

所以你可以简单地通过在前一个按钮的onClick上减少mQuestion来实现你的解决方案。

代码看起来像这样:

public class MainActivityextends AppCompatActivity {
    private QuestionLibraryBeginner mQuestionLibrary = new 
    QuestionLibraryBeginner();
    private int mQuestionNumber = 1; // current question number
    //initialising navigation buttons
    private Button mPrevious;
    private Button mNext;
    private TextView mQuestionText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_beginner_review);
        mPrevious = (Button) findViewById(R.id.previous);
        mNext = (Button) findViewById(R.id.next);
        // receive the current question number from last activity by Intent
        Intent intent = getIntent();
        mNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            if (mQuestionNumber < mQuestionLibrary.getLength()) {
                mQuestionNumber++;
                updateQuestion();
            }
        });
        mPrevious.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // i want it to loop backwards from here
                            if(mQuestionNumber > 0){
                                mQuestionNumber--;
                                updateQuestion();
                            }
                            else
                                {}//don't do anything to prevent IndexOutOfBounds
            }
    });

    // logic to update question from array
    private void updateQuestion() {
        if (mQuestionNumber < mQuestionLibrary.getLength()) {
            mQuestionText.setText(mQuestionLibrary.getQuestion(mQuestionNumber));
        }
    }

}

答案 2 :(得分:0)

这是解决边界的解决方案

android {
    …
    buildTypes {
        release {
            crunchPngs true // or false
        }
    }
}

答案 3 :(得分:0)

可以通过添加flag来提及移动,

来完成
mNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                updateQuestion(true); 
        });
mPrevious.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                updateQuestion(false);
            }
        });

该方法如下:

private void updateQuestion(boolean forward) {
        if(forward && mQuestionNumber < mQuestionLibrary.getLength())
            mQuestionNumber++
        else if (mQuestionNumber>1)
            mQuestionNumber--;
        mQuestionText.setText(mQuestionLibrary.getQuestion(mQuestionNumber));
}

答案 4 :(得分:0)

您需要通过视图逻辑来混淆应用程序的逻辑,将它们分离。 只需使课程问题能够提供上一个和下一个问题。同样根据oop原则(扎实,掌握)从课堂上获取信息并做出外面的决定是错误的,让班级去做它的工作。对于告诉班级做事而不是工作而不是他们来说,不过是这样。

class Questions {
    private int index = 0;

    private String[] mQuestions;

    //better to don't hardcode and provide questions in constructor
    public Question(String[] questions) {
        this.questions = questions;

    }

    //we don't need this method
    int getLength(){
        return mQuestions.length;
    }


    //provide human readable information about current position in question list
    // when you want to provide this information to user introduce label field in activity
    public String currentPosition() {
        int questionPosition = index + 1;
        int questionsLength = mQuestions.length;
        return String.format("current question number is %d from %d" , questionPosition, questionsLength);
    }


    //return next question when available, if next not available returns last question from array
    public String next() {
        int lastIndex = mQuestions.length - 1;
        if(index < lastIndex) {
            index++;
        }
        return mQuestions[index];
    }

    //return current question
    public String current() {
        return mQuestions[index];
    }

    //return previous question when available, if previous not available returns first question from array
    public String previous() {
        int firstIndex = 0;
        if(index > firstIndex) {
            index--;
        }
        return mQuestions[index];

    }

}

如何在Activity中使用它:

public class MainActivity extends AppCompatActivity {
    //better to don't hardcode here, but provide this class from
    //constructor of MainActivity just like questions array provide 
    // to constructor in Questions class
    private Questions questions = new Questions(new String[]{"q1","q2"});
    private Button mPrevious;
    private Button mNext;
    private TextView mQuestionText;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_beginner_review);
        mPrevious = (Button) findViewById(R.id.previous);
        mNext = (Button) findViewById(R.id.next);
        Intent intent = getIntent();

        //when create Activity populate question field with first question
        mQuestionText.setText(questions.current());

        mNext.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                mQuestionText.setText(questions.next());
            }
        });


        mPrevious.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                mQuestionText.setText(questions.previous());
            }
        });
    }
}

P.S。您可以进一步改进此代码以引入 Observer 模式,Activity是一个视图,Questions是模型。