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

时间:2012-08-29 04:48:59

标签: java android sudoku

我有一个扩展View的类PuzzleView。我希望能够打开一个新的活动。当if语句返回true时,从这个View中恭喜。

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);
  }

我得到的错误是“构造函数Intent(PuzzleView,Class)未定义”这里

new Intent(PuzzleView.this, Congratulations.class);

在回复@imrankhan时,这里是整个onKeyDown()

@Override
   public boolean onKeyDown(int keyCode, KeyEvent event) 
   {

       if (game.isSolved()== true)
       {
           Context context = getContext();
           Intent i = new Intent(context, Congratulations.class);
           context.startActivity(i);
       }
       else
       {
      Log.d(TAG, "onKeyDown: keycode=" + keyCode + ", event="
            + event);
      switch (keyCode) {
      case KeyEvent.KEYCODE_DPAD_UP:
         select(selX, selY - 1);
         break;
      case KeyEvent.KEYCODE_DPAD_DOWN:
         select(selX, selY + 1);
         break;
      case KeyEvent.KEYCODE_DPAD_LEFT:
         select(selX - 1, selY);
         break;
      case KeyEvent.KEYCODE_DPAD_RIGHT:
         select(selX + 1, selY);
         break;
      case KeyEvent.KEYCODE_0:
      case KeyEvent.KEYCODE_SPACE: setSelectedTile(0); break;
      case KeyEvent.KEYCODE_1:     setSelectedTile(1); break;
      case KeyEvent.KEYCODE_2:     setSelectedTile(2); break;
      case KeyEvent.KEYCODE_3:     setSelectedTile(3); break;
      case KeyEvent.KEYCODE_4:     setSelectedTile(4); break;
      case KeyEvent.KEYCODE_5:     setSelectedTile(5); break;
      case KeyEvent.KEYCODE_6:     setSelectedTile(6); break;
      case KeyEvent.KEYCODE_7:     setSelectedTile(7); break;
      case KeyEvent.KEYCODE_8:     setSelectedTile(8); break;
      case KeyEvent.KEYCODE_9:     setSelectedTile(9); break;
      case KeyEvent.KEYCODE_ENTER:
      case KeyEvent.KEYCODE_DPAD_CENTER:
         game.showKeypadOrError(selX, selY);
         break;
      default:
         return super.onKeyDown(keyCode, event);
      }
      return true;
       }


   }

5 个答案:

答案 0 :(得分:0)

尝试

 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) 
{
  if (game.isSolved()== true)
  {
    Context context = getContext();
    Intent i = new Intent(context, Congratulations.class);
    context.startActivity(i);

  }
 return super.onKeyDown(keyCode, event);    
}

答案 1 :(得分:0)

你为什么不试试这个 -

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

答案 2 :(得分:0)

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

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);

答案 3 :(得分:0)

我同意这里的其他答案。但看起来他们缺乏信息,因为它不被允许。让我简单地说一下。

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

但是你要做的是,你试图将 this 引用传递给扩展View的类,这就是你得到这个错误的原因。

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

  

最后但并非最不重要的是,Activity实际上是从Context Class扩展而来的。所以他们中的任何一个都会为你完成任务。

答案 4 :(得分:0)

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

 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" />