【问题标题】:changing text on textview with button's onClickListener使用按钮的 onClickListener 更改 textview 上的文本
【发布时间】:2017-10-18 04:51:35
【问题描述】:

您好,我正在 android 工作室“FlashCards”中开发我的第一个更大的应用程序。我希望它能够工作,所以在您单击按钮后,抽认卡的文本视图会将其文本更改为下一个随机抽认卡,直到您看到所有这些我如何才能从 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) {

            }
        });
    }

}

【问题讨论】:

    标签: java android onclicklistener


    【解决方案1】:

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

    我认为最好以随机顺序保留所有项目的列表。你只需要迭代它。

    类似:

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

    【讨论】:

    • 只要未声明为 final,onClick 是否可以访问 currentPosition?
    • 是的,因为在后台,它调用this.currentPosition,其中this 是外部类并且是最终的......匿名对象捕获外部实例类。
    • 您的想法比我之前的想法好得多,尽管当我启动我的应用程序并尝试向此类发送意图时,它会关闭,我不知道为什么(我已经在清单中进行了活动)这里是整个代码:linkFlashCardsDeck 是我自己的类,它的工作原理与 ArrayList 类似,因此您可以这样对待它(它有一些额外的抽认卡逻辑,但尚未在此代码中使用)我是否犯了任何我没有看到的明显错误在这里?
    • 在我检查之前,请检查 logcat 以了解您的应用崩溃时的异常情况。
    • 我已经解决了这个问题,这是我在随机算法中使用 i++ 而不是 i-- 的越界异常。我遇到了另一个问题,我希望应用程序在你按下“我不”后表现良好t know”按钮,它将显示正确答案,5秒后它将使用 setCurrentCard() 设置另一张卡;我试过使用处理程序和计时器,我读过计时器在我的情况下更好(这是真的吗?),无论如何,在使用计时器并在 4 秒后按下该按钮后,它会关闭此活动并返回主要活动(死活动有 timer-0 异常)shpild 我使用这个方法:runOnUiThread ?
    猜你喜欢
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    相关资源
    最近更新 更多