类必须声明为抽象或实现抽象方法?

7

看起来我在这里做的一切都是正确的,但我肯定漏掉了什么。希望能解释一下为什么我在代码的第一行得到了那个错误,以及我应该如何解决这种问题?我是 Android 开发新手。

public class page2 extends AppCompatActivity implements OnClickListener {


/**
 * ATTENTION: This was auto-generated to implement the App Indexing API.
 * See https://g.co/AppIndexing/AndroidStudio for more information.
 */
private GoogleApiClient client;

ImageButton rock, scissors, paper;
Random randomNum = new Random();
int cpuMov;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activitypage2); //set what xml page style to display

    rock = (ImageButton) findViewById(R.id.imageButtonRock);
    scissors = (ImageButton) findViewById(R.id.imageButtonScissors);
    paper = (ImageButton) findViewById(R.id.imageButtonPaper);

    rock.setOnClickListener(new OnClickListener() { // calling onClick() method
        @Override
        //method for handling what happens when you click Rock buttonImage.
        public void onClick(View v) {

            // number between 1-3 inclusive (max-min+1)+1
            cpuMov = randomNum.nextInt(3 - 1 + 1) + 1;
            buildAlert(cpuMov, "imageButtonRock");
            moveViewToScreenCenter(v);//float to center
        }
    });

    scissors.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

            // number between 1-3 inclusive (max-min+1)+1
            cpuMov = randomNum.nextInt(3 - 1 + 1) + 1;
            buildAlert(cpuMov, "imageButtonScissors");
            moveViewToScreenCenter(v);//float to center
        }
    });

    paper.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

            // number between 1-3 inclusive (max-min+1)+1
            cpuMov = randomNum.nextInt(3 - 1 + 1) + 1;
            buildAlert(cpuMov, "imageButtonPaper");
            moveViewToScreenCenter(v);//float to center
        }
    });

} //EoOnCreate

private void moveViewToScreenCenter( View view )
{
    RelativeLayout root = (RelativeLayout) findViewById( R.id.rootLayout );
    DisplayMetrics dm = new DisplayMetrics();
    this.getWindowManager().getDefaultDisplay().getMetrics( dm );
    int statusBarOffset = dm.heightPixels - root.getMeasuredHeight();

    int originalPos[] = new int[2];
    view.getLocationOnScreen( originalPos );

    int xDest = dm.widthPixels/2;
    xDest -= (view.getMeasuredWidth()/2);
    int yDest = dm.heightPixels/2 - (view.getMeasuredHeight()/2) - statusBarOffset;

    TranslateAnimation anim = new TranslateAnimation( 0, xDest - originalPos[0] , 0, yDest - originalPos[1] );
    anim.setDuration(5000); // speed of the movement
    anim.setFillAfter( true );
    view.startAnimation(anim);
}

//builds the message that will be displayed
void appendMessage(AlertDialog.Builder myAlert, String cpuMove, String result) {
    myAlert.setMessage("Computer selects " +cpuMove+ ", you " +result+ "!");
    myAlert.show();
    myAlert.setCancelable(true);
    //how to give id to alertDialog to save in strings.xml

}

public void buildAlert(int move, String btnPressed) {
    AlertDialog.Builder myAlert = new AlertDialog.Builder(this);
    String cpuMove;
    String result;
    if (btnPressed.equals("imageButtonRock")) {
        //Toast.makeText(this, "hooray "+move, Toast.LENGTH_SHORT).show();
        if (move == 1) {
            cpuMove = "Rock";
            result = "tied";
            //call appendMessage to append vars and display the message
            appendMessage(myAlert, cpuMove, result);
        }
        if (move == 2) {
            cpuMove = "Scissors";
            result = "won";
            //call appendMessage to append vars and display the message
            appendMessage(myAlert,cpuMove,result);
        }
        if (move == 3) {
            cpuMove = "Paper";
            result = "lost";
            //call appendMessage to append vars and display the message
            appendMessage(myAlert,cpuMove,result);
        }
    } else if (btnPressed.equals("imageButtonScissors")) {
        if (move == 1) {
            cpuMove = "Rock";
            result = "lost";
            //call appendMessage to append vars and display the message
            appendMessage(myAlert,cpuMove,result);
        }
        if (move == 2) {
            cpuMove = "Scissors";
            result = "tied";
            //call appendMessage to append vars and display the message
            appendMessage(myAlert, cpuMove, result);
        }
        if (move == 3) {
            cpuMove = "Paper";
            result = "won";
            //call appendMessage to append vars and display the message
            appendMessage(myAlert,cpuMove,result);
        }
    } else { //imageButton is Scissors
        if (move == 1) {
            cpuMove = "Rock";
            result = "won";
            //call appendMessage to append vars and display the message
            appendMessage(myAlert,cpuMove,result);
        }
        if (move == 2) {
            cpuMove = "Scissors";
            result = "lost";
            //call appendMessage to append vars and display the message
            appendMessage(myAlert,cpuMove,result);
        }
        if (move == 3) {
            cpuMove = "Paper";
            result = "tied";
            //call appendMessage to append vars and display the message
            appendMessage(myAlert,cpuMove,result);
        }
    }
}

@Override
public void onStart() {
    super.onStart();

    // ATTENTION: This was auto-generated to implement the App Indexing API.
    // See https://g.co/AppIndexing/AndroidStudio for more information.
    client.connect();
    Action viewAction = Action.newAction(
            Action.TYPE_VIEW, // TODO: choose an action type.
            "page2 Page", // TODO: Define a title for the content shown.
            // TODO: If you have web page content that matches this app activity's content,
            // make sure this auto-generated web page URL is correct.
            // Otherwise, set the URL to null.
            Uri.parse("http://host/path"),
            // TODO: Make sure this auto-generated app deep link URI is correct.
            Uri.parse("android-app://rps.rsp/http/host/path")
    );
    AppIndex.AppIndexApi.start(client, viewAction);
}

@Override
public void onStop() {
    super.onStop();

    // ATTENTION: This was auto-generated to implement the App Indexing API.
    // See https://g.co/AppIndexing/AndroidStudio for more information.
    Action viewAction = Action.newAction(
            Action.TYPE_VIEW, // TODO: choose an action type.
            "page2 Page", // TODO: Define a title for the content shown.
            // TODO: If you have web page content that matches this app activity's content,
            // make sure this auto-generated web page URL is correct.
            // Otherwise, set the URL to null.
            Uri.parse("http://host/path"),
            // TODO: Make sure this auto-generated app deep link URI is correct.
            Uri.parse("android-app://rps.rsp/http/host/path")
    );
    AppIndex.AppIndexApi.end(client, viewAction);
    client.disconnect();
}

}

我知道View.OnClickListener必须实现onClick()函数,那我没有做到吗?

2个回答

7
您需要实现您正在实现的接口中所有未实现的方法。在您的情况下,接口是OnClickListener,它需要有一个方法: public abstract void onClick (View v) 要么删除接口,要么实现该方法。如果您使用的是Android Studio,可以轻松地将光标放在OnClickListener上并按ALT+ENTER,它会给您提供解决错误的选项。
从您的代码中可以看出,您已经为按钮提供了正确的onClickListeners,因此解决方案可能只是删除implements OnClickListener,因为您没有使用它。

1
哦,好的,那就有道理了!谢谢。 - fatalError
1
Alt-Enter 万岁!! - publicknowledge
根据您的代码,我可以看到您已经为按钮设置了正确的onClickListeners,因此解决方案可能只是删除“implements OnClickListener”,因为您没有使用它。 - Fluffeh
是的,但我也想仔细解释发生了什么,而不仅仅提供一个三个单词的解决方案。 - Vucko

2

从您的类定义中移除implements OnClickListener


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接