2013-12-14 185 views
0

我对android非常陌生。我一直在阅读大量的教程。但我想获得一段简单的代码来工作。我想做一个纸牌游戏。所以我以为我会开始创建一个绘制一个具体的dimiension圆角矩形的类(我不想出售或分享游戏,因此可移植性不是问题)。创建自定义视图时出错

这是我写的类:我创建一个XML格式的线性布局

public class Card extends View{ 

RectF borders; 
Paint paint; 
float rad; 

public Card(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
    borders.set((float)0.0, (float)0.0, (float)2.5, (float)3.5); 
    rad = 1; 
    paint.setARGB(0, 117, 217, 222);   
} 

protected void onDraw(Canvas canvas){  
    canvas.drawRoundRect(borders, rad, rad, paint); 
} 

} 

,然后这是主要的活动代码:

public class MainActivity extends Activity { 

LinearLayout HandLayout; 
Card card; 

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

    HandLayout = (LinearLayout)findViewById(R.id.hand_gallery); 
    HandLayout.addView(card); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

} 

当我执行,我得到一个空指针例外。我的猜测是因为我应该添加一个像卡=新卡(上下文),但我不知道从哪里获得上下文...

感谢您的任何帮助!

编辑:

这是错误代码

12-14 14:23:36.900: E/AndroidRuntime(22580): FATAL EXCEPTION: main 
12-14 14:23:36.900: E/AndroidRuntime(22580): java.lang.RuntimeException: Unable to start activity ComponentInfo{legen.dary/legen.dary.MainActivity}: java.lang.NullPointerException 
12-14 14:23:36.900: E/AndroidRuntime(22580): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
12-14 14:23:36.900: E/AndroidRuntime(22580): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
12-14 14:23:36.900: E/AndroidRuntime(22580): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
12-14 14:23:36.900: E/AndroidRuntime(22580): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
12-14 14:23:36.900: E/AndroidRuntime(22580): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-14 14:23:36.900: E/AndroidRuntime(22580): at android.os.Looper.loop(Looper.java:137) 
12-14 14:23:36.900: E/AndroidRuntime(22580): at android.app.ActivityThread.main(ActivityThread.java:4745) 
12-14 14:23:36.900: E/AndroidRuntime(22580): at java.lang.reflect.Method.invokeNative(Native Method) 
12-14 14:23:36.900: E/AndroidRuntime(22580): at java.lang.reflect.Method.invoke(Method.java:511) 
12-14 14:23:36.900: E/AndroidRuntime(22580): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
12-14 14:23:36.900: E/AndroidRuntime(22580): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
12-14 14:23:36.900: E/AndroidRuntime(22580): at dalvik.system.NativeStart.main(Native Method) 
12-14 14:23:36.900: E/AndroidRuntime(22580): Caused by: java.lang.NullPointerException 
12-14 14:23:36.900: E/AndroidRuntime(22580): at legen.dary.Card.<init>(Card.java:18) 
12-14 14:23:36.900: E/AndroidRuntime(22580): at legen.dary.MainActivity.onCreate(MainActivity.java:28) 
12-14 14:23:36.900: E/AndroidRuntime(22580): at android.app.Activity.performCreate(Activity.java:5008) 
12-14 14:23:36.900: E/AndroidRuntime(22580): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
12-14 14:23:36.900: E/AndroidRuntime(22580): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
12-14 14:23:36.900: E/AndroidRuntime(22580): ... 11 more 

我已经试过了如下修改代码:

public class MainActivity extends Activity { 

LinearLayout HandLayout; 
Card card; 

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

    HandLayout = (LinearLayout)findViewById(R.id.hand_gallery); 
    card = new Card(this); 
    HandLayout.addView(card); 

} 
} 

回答

1
RectF borders; 
Paint paint; 
float rad; 

public Card(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
    borders.set((float)0.0, (float)0.0, (float)2.5, (float)3.5); 
    rad = 1; 
    paint.setARGB(0, 117, 217, 222);   
} 

borderspaint这里没有初始化。这是导致NPE的原因。

要得到的东西显示,也考虑以下几点:

  • 你的alpha值为0,即完全透明。考虑使用255代替。

  • borders坐标接近于0,因此无论如何绘制都很小。考虑将2.53.5增加到更大的值。

+0

谢谢!就是这样。我不再崩溃了!我不能相信我已经忘记了初始化这样一个简单的代码..... – aarelovich

+0

然而,没有实际绘制的卡.....屏幕是白色的,因为总是...... – aarelovich

+0

@ user792589更新了一对夫妇的答案的子弹让你的卡片呈现。 – laalto

0

使用new Card(this)因为Activity扩展上下文

+0

谢谢!不过我仍然遇到和以前一样的问题..... – aarelovich

1

写onCreate()像这样 -

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

    HandLayout = (LinearLayout)findViewById(R.id.hand_gallery); 
    HandLayout.addView(new Card(this)); 

} 
+0

我试过,但是我仍然得到NullPointer异常... – aarelovich

+0

你还没有初始化Card类中的边界对象 –

+0

是的!谢谢。另一种灵魂已经指出了这一点。我解决了它,我没有更多的崩溃。 Howevever没有矩形画在屏幕上...... – aarelovich