【问题标题】:How do I call a function from within a statement in the event listener?如何从事件侦听器的语句中调用函数?
【发布时间】:2019-09-22 17:18:04
【问题描述】:

我一直在做一个小项目,但在实施我的想法时遇到了问题。我正在尝试构建的应用程序是一个教育应用程序,它给出随机的基本数学(+、-、*、/)问题,如果学生做对了,它应该显示下一个问题,否则,它应该给他/她有机会再试一次。

我的问题具体在最后一部分,我写了一个函数来显示下一个问题,但是我不知道点击按钮时如何调用它。

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Button;

import java.util.Random;

import static java.lang.String.valueOf;


public class MainActivity extends AppCompatActivity {
    TextView    fN;
    TextView    sN;
    TextView    oP;
    TextView    out;
    TextView    ht;
    EditText    ans;
    Button      btn;
    int answer;
    int fNum;
    int sNum;
    int opNum;
    Random r;
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ht.setVisibility(View.GONE);

        final String[]    ops    = {"+","-","÷","×"};
        final String[]    pass   = {
                                    "Very good!",
                                    "Excellent!",
                                    "Nice work!",
                                    "Keep up the good work!"

        };
        final String[]    fail   = {
                                    "No. Please try again.",
                                    "Wrong. Try once more.",
                                    "Don't give up!",
                                    "No. Keep trying."
        };
        public static void nextQ() {
            //UI variables
            fN = findViewById(R.id.fN);
            sN = findViewById(R.id.sN);
            oP = findViewById(R.id.oP);
            out = findViewById(R.id.out);
            ans = findViewById(R.id.Ans);
            btn = findViewById(R.id.btn);
            //functionalities variables
            r = new Random();
            fNum = r.nextInt(9);
            sNum = r.nextInt(9);
            opNum = r.nextInt(ops.length);
            if (opNum == 0)
                answer = fNum + sNum;
            if (opNum == 1)
                answer = fNum - sNum;
            if (opNum == 2)
                answer = fNum / sNum;
            if (opNum == 3)
                answer = fNum * sNum;

            ht.setText(answer);
        }
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                ht = findViewById(R.id.hText);



                fN.setText(fNum);
                sN.setText(sNum);
                oP.setText(ops[opNum]);

                int usrAns = Integer.parseInt(valueOf(ans.getText()));

                int rMSG   = r.nextInt(pass.length);

                if(answer == usrAns)
                    out.setText(""+pass[rMSG]);
                    nextQ();
                if(answer != usrAns)
                    out.setText(""+fail[rMSG]);
            }
            });
    }
}

【问题讨论】:

    标签: java android oop methods


    【解决方案1】:

    从函数nextQ() 中删除static。并将其从onCreate() 中删除。把它放在外面onCreate()。 函数如下所示:

    onCreate(){ ...  }
    public void nextQ() {
    ....
    }
    

    这样称呼

    MainActivity.this.nextQ();
    

    删除下面的代码形式nextQ()并放入onCreate()方法:

    fN = findViewById(R.id.fN);
    sN = findViewById(R.id.sN);
    oP = findViewById(R.id.oP);
    out = findViewById(R.id.out);
    ans = findViewById(R.id.Ans);
    btn = findViewById(R.id.btn);
    

    【讨论】:

    • 有一个改进,但错误更改为无法解决方法..
    • 将 nextQ() 方法放在 onCreate() 方法之外
    • 这两个答案都有效..“使文本错误消失”,但现在,应用程序在运行时崩溃,甚至在显示界面之前......
    • 在 android studio 中检查 logcat。它位于底部工具栏上。它会在您操作应用程序时向您显示日志。
    • 是模拟器错误。尝试连接物理设备。并发布“logcat”列表。在 android studio 中,它在“运行”后的左下角可见。
    【解决方案2】:

    尝试输入这段代码并检查它是否有效?

    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import java.util.Random;
    import static java.lang.String.valueOf;
    
    public class MainActivity extends AppCompatActivity {
       TextView fN;
       TextView sN;
       TextView oP;
       TextView out;
       TextView ht;
       EditText ans;
       Button btn;
       int answer;
       int fNum;
       int sNum;
       int opNum;
       Random r;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ht.setVisibility(View.GONE);
        btn = findViewById(R.id.btn);
        fN = findViewById(R.id.fN);
        sN = findViewById(R.id.sN);
        oP = findViewById(R.id.oP);
        out = findViewById(R.id.out);
        ans = findViewById(R.id.Ans);
    
        final String[] ops = {"+", "-", "÷", "×"};
        final String[] pass = {
                "Very good!",
                "Excellent!",
                "Nice work!",
                "Keep up the good work!"
    
        };
        final String[] fail = {
                "No. Please try again.",
                "Wrong. Try once more.",
                "Don't give up!",
                "No. Keep trying."
        };
    
        btn.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
                ht = findViewById(R.id.hText);
    
    
                fN.setText(fNum);
                sN.setText(sNum);
                oP.setText(ops[opNum]);
    
                int usrAns = Integer.parseInt(valueOf(ans.getText()));
    
                int rMSG = r.nextInt(pass.length);
    
                if (answer == usrAns)
                    out.setText("" + pass[rMSG]);
                nextQ();
                if (answer != usrAns)
                    out.setText("" + fail[rMSG]);
            }
        });
    }
    
    public void nextQ() {
    
        //functionalities variables
        r = new Random();
        fNum = r.nextInt(9);
        sNum = r.nextInt(9);
        opNum = r.nextInt(ops.length);
        if (opNum == 0)
            answer = fNum + sNum;
        if (opNum == 1)
            answer = fNum - sNum;
        if (opNum == 2)
            answer = fNum / sNum;
        if (opNum == 3)
            answer = fNum * sNum;
        ht.setText(answer);
    }
    }
    

    【讨论】:

    • 我认为移动按钮声明变化不大,错误出现在 if(answer == usrAns).. 当我尝试调用 nextQ();
    • 它成功了,谢谢,但现在是我最糟糕的噩梦!无论我在哪里运行,该应用程序都会无缘无故地崩溃...
    • 所以,问题是我使用 setText 和 int,我不得不使用 fN.setText(Integer.toString(fNum)); sN 也一样 :) 但最初的问题已通过您的初始答案解决,非常感谢!!
    猜你喜欢
    • 2018-08-02
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多