setContentView(view)vs setContentView(R.layout ..)

时间:2012-10-30 07:08:56

标签: android android-layout android-view

您好我想创建一个使用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();
}

2 个答案:

答案 0 :(得分:1)

唯一原因可能是drawabledraw()中使用的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);
}