您好我想创建一个使用Multi-touch支持的应用程序。
多点触控的我正在使用this code
现在您可以看到 org.metalev.multitouch.photosortr.PhotoSortrActivity 活动 因为代码如下所示
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setTitle(R.string.instructions);
photoSorter = new PhotoSortrView(this);
setContentView(photoSorter);
}
它会正常工作
但是如果我想在我的视图中添加此视图,我会在上面编写如下代码...
我创建了一个名为activity_main.xml的XML文件
<org.metalev.multitouch.photosortr.PhotoSortrView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</org.metalev.multitouch.photosortr.PhotoSortrView>
并且在onCreate方法中我的变化如下
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setTitle(R.string.instructions);
photoSorter = new PhotoSortrView(this);
setContentView(R.layout.activity_main);
}
如果我喜欢这种方式,我将在下面收到一个错误是logcat
10-30 12:15:29.319: E/AndroidRuntime(6652): java.lang.NullPointerException
10-30 12:15:29.319: E/AndroidRuntime(6652): at org.metalev.multitouch.photosortr.PhotoSortrView$Img.draw(PhotoSortrView.java:274)
10-30 12:15:29.319: E/AndroidRuntime(6652): at org.metalev.multitouch.photosortr.PhotoSortrView.onDraw(PhotoSortrView.java:86)
10-30 12:15:29.319: E/AndroidRuntime(6652): at android.view.View.draw(View.java:6914)
10-30 12:15:29.319: E/AndroidRuntime(6652): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
10-30 12:15:29.319: E/AndroidRuntime(6652): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
10-30 12:15:29.319: E/AndroidRuntime(6652): at android.view.View.draw(View.java:6917)
10-30 12:15:29.319: E/AndroidRuntime(6652): at android.widget.FrameLayout.draw(FrameLayout.java:357)
10-30 12:15:29.319: E/AndroidRuntime(6652): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
10-30 12:15:29.319: E/AndroidRuntime(6652): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
10-30 12:15:29.319: E/AndroidRuntime(6652): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
在PhotoSortrView.java文件中的代码如下所示,我收到此错误
public void draw(Canvas canvas) {
canvas.save();
float dx = (maxX + minX) / 2;
float dy = (maxY + minY) / 2;
---->drawable.setBounds((int) minX, (int) minY, (int) maxX, (int) maxY); // HERE getting drawable == NULL
canvas.translate(dx, dy);
canvas.rotate(angle * 180.0f / (float) Math.PI);
canvas.translate(-dx, -dy);
drawable.draw(canvas);
canvas.restore();
}
答案 0 :(得分:1)
唯一原因可能是drawable
类draw()
中使用的Img
为空,因为canvas
由系统传递,而方法中的其余变量是原语。此变量在load()
类Img
中初始化,而loadImages()
类则从PhotoSortrView
类的loadImages()
调用。
现在,我猜您正在调用活动photoSorter
中的onResume()
变量PhotoSortrView
。但是,通过膨胀布局创建了另一个loadImages()
实例。请务必同时致电该实例的{{1}}。
答案 1 :(得分:0)
对僚机的建议我已经解决了如下方式:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setTitle(R.string.instructions);
setContentView(R.layout.activity_main);
photoSorter = (PhotoSortrView)findViewById(R.id.photoSortView);
}
@Override
protected void onResume() {
super.onResume();
photoSorter.loadImages(this);
}
在PhotosorterView.java文件代码如下。
public PhotoSortrView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public PhotoSortrView(Context context) {
super(context);
init(context);
}
public PhotoSortrView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}