【问题标题】:The type new View.OnClickListener must implement the inherited abstract method类型 new View.OnClickListener 必须实现继承的抽象方法
【发布时间】:2014-11-15 16:01:02
【问题描述】:

所以我刚开始编程,但我并没有真正得到 OnClickListener 方法。我已经用谷歌搜索了我遇到的错误:“类型 new View.OnClickListener(){} 必须实现继承的抽象方法 View.OnClickListener.OnClick(View)”,我试图在我的代码中更改一些内容,但它仍然可以不工作。谁能告诉我我需要在我的代码中更改什么?提前致谢。

MainMenuScreen.java:

package com.wouter.testjk;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;

public class MainMenuScreen extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main_menu);
 //error on the line below
        ((Button) findViewById(R.id.one_player)).setOnClickListener(new OnClickListener() { //the error is here
            public void onClick(View V) {
                Log.d("DEBUG", "One Player Button Pressed!");
                Intent intent = new Intent(MainMenuScreen.this, TicTacToeGame.class);
                intent.putExtra("gameType", true);
                startActivityForResult(intent, 0);
            }
        });
        ((Button) findViewById(R.id.two_player)).setOnClickListener(new OnClickListener() {
            public void onClick(View V) {
                Log.d("DEBUG", "Two Player Button Pressed!");
                Intent intent = new Intent(MainMenuScreen.this, TicTacToeGame.class);
                intent.putExtra("gameType", false);
                startActivityForResult(intent, 0);
            }
        });

        ((Button) findViewById(R.id.exit_game)).setOnClickListener(new OnClickListener() {
            public void onClick(View V) {
                Log.d("DEBUG", "Exit Game Button Pressed!");
                MainMenuScreen.this.finish();
            }
        });
    }
}

MainActivity.java:

package com.wouter.testjk;


import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;

import com.wouter.testjk.R;


public class MainActivity extends Activity implements OnClickListener{

    private TicTacToeGame mGame;

    private Button mBoardButtons[];

    private TextView mInfoTextView;
    private TextView mPlayeroneCount;
    private TextView mTieCount;
    private TextView mPlayertwoCount;
    private TextView mPlayeroneText; 
    private TextView mPlayertwoText;

    private int mPlayeroneCounter = 0;
    private int mTieCounter = 0;
    private int mPlayertwoCounter = 0;

    private boolean mPlayeroneFirst = true;
    private boolean mIsSinglePlayer = false;
    private boolean mIsPlayerOneTurn = true;
    private boolean mGameOver = false;

    @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        boolean mGameType = getIntent().getExtras().getBoolean("gametype");

        mBoardButtons = new Button[mGame.getBOARD_SIZE()];
        mBoardButtons[0] = (Button) findViewById(R.id.one);
        mBoardButtons[1] = (Button) findViewById(R.id.two);
        mBoardButtons[2] = (Button) findViewById(R.id.three);
        mBoardButtons[3] = (Button) findViewById(R.id.four);
        mBoardButtons[4] = (Button) findViewById(R.id.five);
        mBoardButtons[5] = (Button) findViewById(R.id.six);
        mBoardButtons[6] = (Button) findViewById(R.id.seven);
        mBoardButtons[7] = (Button) findViewById(R.id.eight);
        mBoardButtons[8] = (Button) findViewById(R.id.nine);

        Button mTen = (Button) findViewById(R.id.ten);
        mTen.setOnClickListener(this);
        Button mEleven = (Button) findViewById(R.id.eleven);
        mEleven.setOnClickListener(this);



        mInfoTextView = (TextView) findViewById(R.id.information);
        mPlayeroneCount = (TextView) findViewById(R.id.humancount);
        mTieCount = (TextView) findViewById(R.id.tiesCount);
        mPlayertwoCount = (TextView) findViewById(R.id.androidCount);
        mPlayeroneText = (TextView) findViewById(R.id.human);
        mPlayertwoText = (TextView) findViewById(R.id.android);

        mPlayeroneCount.setText(Integer.toString(mPlayeroneCounter));
        mTieCount.setText(Integer.toString(mTieCounter));
        mPlayeroneCount.setText(Integer.toString(mPlayertwoCounter));

        mGame = new TicTacToeGame();

        startNewGame(mGameType);

    }

    private void startNewGame(boolean isSingle)
    {
        //some code here
    }

    private class ButtonClickListener implements View.OnClickListener
    {
        int location;

        public ButtonClickListener(int location)
        {
            this.location = location;
        }

        @Override
        public void onClick(View view) {
            if (!mGameOver)
            {
                if(mBoardButtons[location].isEnabled())
                {
                    if(mIsSinglePlayer)
                    {
                         setMove(mGame.PLAYER_ONE, location);

                         int winner = mGame.checkForWinner();

                         if (winner == 0)
                         {
                             mInfoTextView.setText(R.string.turn_computer);
                             int move = mGame.getComputerMove();
                             setMove(mGame.PLAYER_TWO, move);
                             winner = mGame.checkForWinner();

                         }
                         if (winner == 0)
                                 mInfoTextView.setText(R.string.turn_human);
                         else if (winner == 1)
                         {
                             mInfoTextView.setText(R.string.result_tie);
                             mTieCounter++;
                             mTieCount.setText(Integer.toString(mTieCounter));
                             mGameOver = true;
                         }       
                         else if (winner ==2)
                         {
                             mInfoTextView.setText(R.string.result_human_wins);
                             mPlayeroneCounter++;
                             mPlayeroneCount.setText(Integer.toString(mPlayeroneCounter));
                             mGameOver = true;
                         }
                         else if (winner ==3)
                         {
                             mInfoTextView.setText(R.string.result_android_wins);
                             mPlayertwoCounter++;
                             mPlayertwoCount.setText(Integer.toString(mPlayertwoCounter));
                             mGameOver = true;
                         }

                    }
                    else
                    {
                        if(mIsPlayerOneTurn)
                        {
                            setMove(mGame.PLAYER_ONE, location);
                        }
                        else
                        {setMove(mGame.PLAYER_TWO, location);

                        }


                        int winner = mGame.checkForWinner();

                        if (winner == 0)
                        {
                            if(mIsPlayerOneTurn)
                            {
                                mInfoTextView.setText(R.string.turn_player_two);
                                mIsPlayerOneTurn = false;
                            }
                            else
                            {
                                mInfoTextView.setText(R.string.turn_player_one);
                                mIsPlayerOneTurn = true;
                            }
                        }
                        else if (winner == 1)
                        {
                            mInfoTextView.setText(R.string.result_tie);
                            mTieCounter++;
                            mTieCount.setText(Integer.toString(mTieCounter));
                            mGameOver = true;
                        }       
                        else if (winner ==2)
                        {
                            mInfoTextView.setText(R.string.player_one_wins);
                            mPlayeroneCounter++;
                            mPlayeroneCount.setText(Integer.toString(mPlayeroneCounter));
                            mGameOver = true;
                        }
                        else if (winner ==3)
                        {
                            mInfoTextView.setText(R.string.player_two_wins);
                            mPlayertwoCounter++;
                            mPlayertwoCount.setText(Integer.toString(mPlayertwoCounter));
                            mGameOver = true;
                     }
                    }
                }
            }    
        }
    }

    private void setMove(char player, int location)
    {
        mGame.setMove(player,location);
        mBoardButtons[location].setEnabled(false);
        mBoardButtons[location].setText(String.valueOf(player));
        if (player == mGame.PLAYER_ONE)
            mBoardButtons[location].setTextColor(Color.GREEN);
        else
        {
            mBoardButtons[location].setTextColor(Color.RED);
        }
    }

    @Override
    public void onClick(View view) {

        switch (view.getId())
        {
        case R.id.ten:

            startNewGame(mIsSinglePlayer);
            return;

        case R.id.eleven:

            MainActivity.this.finish();
            return;

        }
    }
}

【问题讨论】:

  • 错误在哪一行抛出?
  • 当然,我忘了注明。我更新了代码

标签: java android eclipse inheritance


【解决方案1】:

听起来像是项目错误。首先遵循良好的代码指南。

  1. 当覆盖一个方法(例如 onClick)时,在它之前添加一个 @Override 注释。如果这样的方法不存在,这会让编译器大喊大叫。

  2. 使用View.OnClickListener 指定您的接口属于哪个类。

  3. Button 已经是 View,无需强制转换即可设置 OnClickListener。

它可能是这样的:

// No need to cast it to a button here, as it 
findViewById(R.id.one_player).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Log.d("DEBUG", "One Player Button Pressed!");
        Intent intent = new Intent(MainMenuScreen.this, TicTacToeGame.class);
        intent.putExtra("gameType", true);
        startActivityForResult(intent, 0);
    }
});

最后clean/rebuild你的项目,因为我在使用你的代码时不会出现这个错误。

【讨论】:

  • 好的,我试过了,然后清理/重建。但错误仍然发生
  • 现在可以了,我用 findViewById(R.id.two_player)).setOnClickListener(new OnClickListener() { 复制了这句话并粘贴,二改一,成功了。跨度>
【解决方案2】:

OnClickListener 是一个定义方法void onClick(View v)接口。将implements OnClickListener 添加到您的Activity 类意味着该类实现了接口,因此必须具有onClick(View view) 方法。这主要是为了让您可以在需要OnClickListener 的地方传递this,而您也这样做了。

但是,当您编写代码时,您应该从 Activity 中删除 implements OnClickListenerpart,而是将 ButtonClickListener 类的实例作为 OnClickListeners 传递给您的按钮,如下所示:

Button mTen = (Button) findViewById(R.id.ten);
mTen.setOnClickListener(new ButtonClickListener(10)); /* 10 is just a guess */
Button mEleven = (Button) findViewById(R.id.eleven);
mEleven.setOnClickListener(new ButtonClickListener(11)); /* 11 is just a guess */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多