【问题标题】:.Override method of different class.Override 不同类的方法
【发布时间】:2014-08-14 10:30:43
【问题描述】:

View Class 上调用Activity classonBackPressed 方法?是否可以?那我该怎么办?感谢帮助

更新:我刚刚创建了我的游戏的 GameView,它扩展到 View Class。我创建了一个变量,每当我完成每个级别时都会递增,因此它将限制每场比赛的级别。所以我想实现一个onBackPressed method,只要玩家按下返回键,我就可以将递增变量设置为零。

FULL CODE: 主要活动

public class MainActivity extends Activity {    
private GameView mGameView;
@Override
public void onBackPressed() {
    if (mGameView.interceptBackPressed()) {
        return;
    }
    // TODO Auto-generated method stub
    super.onBackPressed();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);
    mGameView = (GameView) findViewById(GameView.countmaze);

然后进入菜单类

public class menu extends Activity implements OnClickListener {
static int nextmaze;
int countmaze = 0;
GameView gameView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button btnplay = (Button) findViewById(R.id.btnPlay);
    btnplay.setOnClickListener(this);
}
@Override
public void onBackPressed() {
    //I have here an AlertDialog builder
}
@Override
public void onClick(View v) {
    case R.id.btnPlay:
        Toast.makeText(getApplicationContext(), "LEVEL 1",
                Toast.LENGTH_SHORT).show();
        startnextmaze();

    }
}
void startnextmaze() {
    Random rand = new Random();
    Intent game = new Intent(menu.this, Game.class);
    nextmaze = rand.nextInt(5) + 1;
    Maze maze = MazeCreator.getMaze(nextmaze);
    game.putExtra("maze", maze);
    startActivity(game);
}

然后在我的 GameView 类

public class GameView extends View {
static int countmaze;

//Big codes here......

public boolean interceptBackPressed() {
    // TODO Auto-generated method stub
    countmaze = 0;
    return true;
}
}

【问题讨论】:

  • 如果你告诉你到目前为止你做了什么以及你想要实现什么,那么建议好的方法会更容易。
  • 如果您发布代码并展示 Activity 是如何与 GameView 集成的,那么给您准确的答案会容易得多。
  • @Loop 先生,我想我不能谈论我的声誉得分。如果您不介意我们可以继续在 Facebook 上聊天吗?我非常需要你的帮助。提前致谢 ! (facebook.com/j0naldCruz)
  • 我没有 Facebook 帐户。我已经用额外的评论更新了我的答案。没有比这更简单的了。
  • 在 mGameView = (GameView)fVBID(R.id.gameview) 上仍然有问题,因为 gameview 不存在并且我的 GameView 类上没有 xml 布局。

标签: android eclipse class


【解决方案1】:

在 View 类将实现的 Activity onBackPressed 上创建回调

例子

public void interface onBackPressedHandler {

   public void onBackPressed();
}

活动类

public onBackPressedHandler mHandler;


@Override 
public void onCreate(....) {

   GameView game... //Inflate or create.
   game.setActivity(this);

}

public void setListener(onBackPressedHandler handler) {
    mHandler = handler;
}

@Override
public voind onBackPressed() {

  if(mHandler != null) {
       mHandler.onBackPressed();
  }
  super.onBackPressed();

查看类

public GameView extends View implements onBackPressedHandler {

public void setActivity(Activity activity) {
     activity.setListener(this);
}    


public void onBackPressed() {
  //your code here.
    }
}

这个例子展示了当你按下返回按钮时,它会在视图上调用 onBackPress。

希望对你有帮助。

【讨论】:

  • 我需要创建一个新的类来扩展 Activity 吗?还是我会直接上 Activity 类?
  • View类只需要访问Activity类,你不需要它来扩展Acitiviy类。
  • 如果你想调用activity.setListener(this),你必须通过构造函数将Activity传递给View,或者将View的Context转换为Activity,使setListener方法可见。
  • @Loop 先生,您能提供一些代码块吗?我只想在扩展 View ClassClass 上实现 onBackPressed
  • sir @ItzikSamara 我只是不知道在哪里对您刚才提到的 Activity 类进行编辑。
【解决方案2】:

使用以下更改更新您的代码:

活动

public class MyActivity extends Activity {
    private GameView mGameView;

    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.main);
        //View reference to object defined in XML
        mGameView = (GameView) findViewById(R.id.gameview);//id must be specified in XML
        //I assumed that GameView is a part of your XML layout

        //View created programmatically.
        mGameView = new GameView(this);

       //Use one of the above initialisation techniques of mGameView.
    }

    @Override
    public void onBackPressed() {
        //here we are calling method on mGameView which cannot be null
        //that's why we initialised it in onCreate() method
        if (mGameView.interceptBackPressed()) {
            return;
        }
        super.onBackPressed();//finish your Activity
    }
}

游戏视图

public class GameView extends View {

    public boolean interceptBackPressed() {
        //TODO handle your game logic here and return true if you don't
        //want your game to be shutdown, otherwise return false
        return true;
    }

}

【讨论】:

  • interceptBackPressed 方法会是我的新 onBackPressed 吗?
  • 是的,这是你将变量减少到 0 的地方。默认情况下按下销毁活动,因此此方法必须返回 true 以避免它。
  • 我只是在 R.id 上遇到错误。我在哪里申报?
  • R.id 和 R.layout 是示例。您必须在 XML 中为您的视图定义 id。如果您以编程方式创建 GameView,则引用该对象而不是调用 findViewById。这是一个非常基本的东西。考虑查看一些 Android 教程。
猜你喜欢
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2011-07-07
  • 2012-10-29
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多