Java 使用按钮';s onclick侦听器

Java 使用按钮';s onclick侦听器,java,android,onclicklistener,Java,Android,Onclicklistener,嗨,我正在android studio中开发我的第一个更大的应用程序“FlashCards”。我希望它能正常工作,所以在你们点击按钮后,flashcard的文本视图会将其文本更改为下一个随机flashcard,直到你们看到所有这些文本为止。我如何从onClick方法内部执行“继续”循环之类的操作 以下是循环的代码: while(i < mTestDeck.size()) { // generates random number which will represe

嗨,我正在android studio中开发我的第一个更大的应用程序“FlashCards”。我希望它能正常工作,所以在你们点击按钮后,flashcard的文本视图会将其文本更改为下一个随机flashcard,直到你们看到所有这些文本为止。我如何从onClick方法内部执行“继续”循环之类的操作

以下是循环的代码:

    while(i < mTestDeck.size()) {

        // generates random number which will represent position in deck.

        int random = randomGenerator.nextInt() % mTestDeck.size();

        // if random flashcard was already shown create random number again

        if (mTestDeck.get(random).wasShown())
            continue;

        //text view that we will operate on

        TextView deckTextView = (TextView) findViewById(R.id.flashcard_text_view);

        // set text
        deckTextView.setText(mTestDeck.get(random).getFront());

        // set mWasShown to true

        mTestDeck.get(random).flashcardShown();

        Button myButton = (Button) findViewById(R.id.know_answer);

        myButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mTestDeck.correctAnswer();
            }
        });

        myButton = (Button) findViewById(R.id.dont_know_answer);

        myButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
    }

}
while(i
首先,这样,您就有了一个潜在的无限循环。如果它能发生,它就会发生!“获取随机项目并检查其是否正常或重试”不是一个好主意

我认为最好是把所有项目按随机顺序列在一个清单上。你只需要对它进行迭代

比如:

int currentPosition = 0;
List<Card> items = new ArrayList<Card>(mTestDeck).shuffle();

// Call this method once in onCreate or anywhere you initialize the UI
private void function setCurrentCard() {
    Card currentItem = items.get(currentPosition);

    [...] // Set all UI views here

    myButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (currentPosition > items.size) {
                // TODO? End?
                return;
            }

            currentPosition++;
            setCurrentCard();
        }
    });
}
int currentPosition=0;
List items=newarraylist(mTestDeck).shuffle();
//在onCreate或初始化UI的任何位置调用此方法一次
私有无效函数setCurrentCard(){
Card currentItem=items.get(当前位置);
[…]//在此处设置所有UI视图
myButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
如果(currentPosition>items.size){
//待办事项?结束?
返回;
}
currentPosition++;
setCurrentCard();
}
});
}

首先,这样,您就有了一个潜在的无限循环。如果它能发生,它就会发生!“获取随机项目并检查其是否正常或重试”不是一个好主意

我认为最好是把所有项目按随机顺序列在一个清单上。你只需要对它进行迭代

比如:

int currentPosition = 0;
List<Card> items = new ArrayList<Card>(mTestDeck).shuffle();

// Call this method once in onCreate or anywhere you initialize the UI
private void function setCurrentCard() {
    Card currentItem = items.get(currentPosition);

    [...] // Set all UI views here

    myButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (currentPosition > items.size) {
                // TODO? End?
                return;
            }

            currentPosition++;
            setCurrentCard();
        }
    });
}
int currentPosition=0;
List items=newarraylist(mTestDeck).shuffle();
//在onCreate或初始化UI的任何位置调用此方法一次
私有无效函数setCurrentCard(){
Card currentItem=items.get(当前位置);
[…]//在此处设置所有UI视图
myButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
如果(currentPosition>items.size){
//待办事项?结束?
返回;
}
currentPosition++;
setCurrentCard();
}
});
}

只要currentPosition未声明为final,onClick是否有权访问currentPosition?是的,因为在引擎盖下,它调用
this.currentPosition
其中
this
是外部类,是final。。。匿名对象捕获外部实例类。你的想法比我以前的想法要好得多,尽管当我启动应用程序并尝试将意图发送到此类时,它会关闭,我不知道为什么(我在manifes中进行了活动)下面是全部代码:FlashCardsDeck是我自己的类,它与ArrayList类似,所以你可以这样对待它(它有一些额外的flashcard逻辑,但它还没有在代码中使用)我是否犯了任何明显的错误,我在这里没有看到?在我检查之前,当你的应用程序崩溃时,请检查日志以了解异常情况。我已修复了该问题,它是越界异常,我在洗牌算法中使用了I++而不是I-。我面临另一个问题,我希望应用程序能够正常运行,因此在你按下“我不知道”按钮后,它将显示正确答案,5秒钟后,它将使用setCurrentCard()设置另一张卡;我尝试过使用处理程序和计时器,我读到计时器在我的情况下更好(tho是真的吗?),无论如何,在使用计时器并在4秒后按下该按钮后,它关闭此活动并返回主活动(死活动有计时器-0异常)shpild I使用此方法:RUNNUITHREAD?只要未声明为最终,单击将访问currentPosition?是,因为在引擎盖下,它调用
this.currentPosition
,其中
this
是外部类,是最终类。。。匿名对象捕获外部实例类。你的想法比我以前的想法要好得多,尽管当我启动应用程序并尝试将意图发送到此类时,它会关闭,我不知道为什么(我在manifes中进行了活动)下面是全部代码:FlashCardsDeck是我自己的类,它与ArrayList类似,所以你可以这样对待它(它有一些额外的flashcard逻辑,但它还没有在代码中使用)我是否犯了任何明显的错误,我在这里没有看到?在我检查之前,当你的应用程序崩溃时,请检查日志以了解异常情况。我已修复了该问题,它是越界异常,我在洗牌算法中使用了I++而不是I-。我面临另一个问题,我希望应用程序能够正常运行,因此在你按下“我不知道”按钮后,它将显示正确答案,5秒钟后,它将使用setCurrentCard()设置另一张卡;我尝试过使用处理程序和计时器,我读到计时器在我的情况下更好(tho是真的吗?),无论如何,在使用计时器并在4秒后按下该按钮后,它关闭此活动并返回到主活动(死活动有计时器-0例外