Java 如何在扩展视图的类中使用startActivity?

Java 如何在扩展视图的类中使用startActivity?,java,android,sudoku,Java,Android,Sudoku,我有一个扩展视图的类视图。当if语句返回true时,我希望能够从此视图打开一个新的活动 public class PuzzleView extends View { /*Code here blah blah blah then*/ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (game.isSolved()== true) { Context context = getCont

我有一个扩展视图的类视图。当if语句返回true时,我希望能够从此视图打开一个新的活动

public class PuzzleView extends View { 
/*Code here blah blah blah then*/
 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) 
{
  if (game.isSolved()== true)
  {
    Context context = getContext();
    Intent i = new Intent(PuzzleView.this, Congratulations.class);
    getContext().startActivity(i);
  }
我得到的错误是“构造函数意图(拼图视图,类)未定义”

作为对@imrankhan的回复,这里是整个onKeyDown()

尝试


你为什么不试试这个-

Context context = getContext();
Intent i = new Intent(context, Congratulations.class);
context.startActivity(i);

您需要在视图的构造函数中传递活动引用,以后可以使用此引用。因此,定义一个构造函数,如下所示:

public class PuzzleView extends View
{
    Activity mActivity;
    public PuzzleView(Activity activity, Context context)
    {
         super(context);
         this.mActivity=activity;
    }
}
现在使用此活动引用启动活动:

Intent i = new Intent(mActivity, Congratulations.class);
    getContext().startActivity(i);

我同意这里的其他答案。但他们似乎缺乏关于为什么不允许这样做的信息。让我简单地说一下

当您启动一个Intent时,它需要两个参数,一个是上下文或活动引用,另一个是下一个活动类

但您试图做的是,您试图将this引用传递给一个扩展视图的类,这就是为什么会出现此错误

上下文对象实际上充当堆栈中的引用,从控件的传输位置开始。因此,您需要传递上下文对象或活动对象本身

最后但并非最不重要的一点是,活动实际上是上下文类的扩展形式。所以他们中的任何一个都会帮你完成任务


您需要在视图类中保留应用程序上下文,以便下面的代码能够回答您的问题

 public class PuzzleView extends View { 
    Context mContext;
        public PuzzleView (Context context, AttributeSet attrs) {
        super(context, attrs);  
        mContext=context;// keep the context

        } 
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (game.isSolved()== true){
              Intent i = new Intent(mContext, Congratulations.class);
               mcontext.startActivity(i);
      }
编辑

你的观点应该是这样的

<com.yourpackage.PuzzleView  
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/yourid"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" />


修复了第一个错误,但在这一行
public boolean onKeyDown(int-keyCode,KeyEvent-event事件)
我得到错误“此方法必须返回布尔类型的结果”@WillNZ发布您的完整代码。还有,看看example@WillNZ:查看我的编辑答案,并在onKeyDown中添加一个
返回true
或'return false'method@imrankhan请看我的编辑问题,整个onKeyDown方法不喜欢returnsuper,因为已经有一个更进一步的方法了为什么你要获取上下文而不使用它@老实说,JoxTraex不是100%确定。我正在学习,这是在一个例子中,我发现这也有相同的错误问题,修复了第一个错误,但在这一行
public boolean onKeyDown(int-keyCode,KeyEvent-event事件)
我得到错误“此方法必须返回布尔类型的结果”我得到此错误“空白的最后一场比赛可能尚未初始化”在这一行
公共拼图视图(上下文上下文,属性集属性){
您是在xml文件中使用此视图,还是在java文件中使用新关键字创建此视图的实例??什么是可变的“游戏”??您必须在构造函数上初始化它。视图是一个名为“恭喜”的xml文件,它也被添加到清单文件中。如果我向您展示整个java页面,会有帮助吗?我在
super();
Hi-jeet”行上遇到以下错误“构造函数视图()未定义”;Hi-jeet“上下文无法解析为变量”有什么想法吗?在线
公共拼图视图(活动、上下文上下文)
上的“空白最终场游戏可能尚未初始化”,但我不知道在何处初始化。您可以在构造函数中初始化它。
Intent i = new Intent(mActivity, Congratulations.class);
    getContext().startActivity(i);
 public class PuzzleView extends View { 
    Context mContext;
        public PuzzleView (Context context, AttributeSet attrs) {
        super(context, attrs);  
        mContext=context;// keep the context

        } 
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (game.isSolved()== true){
              Intent i = new Intent(mContext, Congratulations.class);
               mcontext.startActivity(i);
      }
<com.yourpackage.PuzzleView  
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/yourid"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" />