将XML RelativeLayout与Surface View相结合

时间:2011-10-28 16:09:20

标签: android surfaceview

我是Android应用程序开发的新手,我想问一些事情。

我在SurfaceView中有一个位图,我希望以编程方式动画和移动。我还想在屏幕上放一个按钮来控制位图的移动。但由于我无法在SurfaceView中放置按钮,因此我在名为main.xml的XML布局中将其声明为RelativeLayout。

这是我的main.xml里面的内容

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/main_layout" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Test Button" />

</RelativeLayout>

所以我要做的是将SurfaceView与我的main.xml中的Layout“组合”(找不到更好的词)。

这是我的Main.java,我尝试将布局与SurfaceView

结合起来
package com.src.test.view;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.RelativeLayout;

public class Main extends Activity {

    private RelativeLayout _myXmlLayout;
    private MyView _myView;
    private Button _myButton;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        _myXmlLayout = (RelativeLayout) findViewById(R.id.main_layout);
        _myView = new MyView(this);
        _myButton = (Button) findViewById(R.id.button1);

        _myXmlLayout.addView(_myButton);
        _myXmlLayout.addView(_myView);

        setContentView(_myXmlLayout);
    }
}

但它给了我一个“应用程序意外停止”的错误。我做错了吗?如果是这样,你能建议一个更好的实现方法吗?

非常感谢您的回复。谢谢!

P.S。还没有位图动画代码和按钮控件。这只是我目前正在解决的观点。 :)

编辑:

我编辑了我的代码,现在是:

所以这是我编辑过的Main.java

package com.src.test.view;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class Main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);

    }
}

这是我的main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <com.src.test.view.MyView
        android:id="@+id/myView" 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

    <Button
        android:text="Test Button"
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left" />
    <Button
        android:text="Test Button2"
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right" />

</FrameLayout>

我试图运行它,但它给了我一个错误。

这是logcat

(ZygoteInit.java:626)
10-29 01:18:51.046: E/AndroidRuntime(318):  at dalvik.system.NativeStart.main(Native Method)
10-29 01:18:51.046: E/AndroidRuntime(318): Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class com.src.test.view.MyView
10-29 01:18:51.046: E/AndroidRuntime(318):  at android.view.LayoutInflater.createView(LayoutInflater.java:503)
10-29 01:18:51.046: E/AndroidRuntime(318):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:565)
10-29 01:18:51.046: E/AndroidRuntime(318):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
10-29 01:18:51.046: E/AndroidRuntime(318):  at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
10-29 01:18:51.046: E/AndroidRuntime(318):  at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
10-29 01:18:51.046: E/AndroidRuntime(318):  at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
10-29 01:18:51.046: E/AndroidRuntime(318):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198)
10-29 01:18:51.046: E/AndroidRuntime(318):  at android.app.Activity.setContentView(Activity.java:1647)
10-29 01:18:51.046: E/AndroidRuntime(318):  at com.src.test.view.Main.onCreate(Main.java:12)
10-29 01:18:51.046: E/AndroidRuntime(318):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-29 01:18:51.046: E/AndroidRuntime(318):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
10-29 01:18:51.046: E/AndroidRuntime(318):  ... 11 more
10-29 01:18:51.046: E/AndroidRuntime(318): Caused by: java.lang.NoSuchMethodException: MyView(Context,AttributeSet)
10-29 01:18:51.046: E/AndroidRuntime(318):  at java.lang.Class.getMatchingConstructor(Class.java:660)
10-29 01:18:51.046: E/AndroidRuntime(318):  at java.lang.Class.getConstructor(Class.java:477)
10-29 01:18:51.046: E/AndroidRuntime(318):  at android.view.LayoutInflater.createView(LayoutInflater.java:475)
10-29 01:18:51.046: E/AndroidRuntime(318):  ... 21 more

感谢您的回复

1 个答案:

答案 0 :(得分:3)

我认为你为自己过度复杂。至少,只需将一个按钮放在SurfaceView上,就可以通过将按钮放在与表面视图相同的FrameLayout中来显示here所显示的内容。

您也可以在xml中声明自定义视图,因此它可能如下所示:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.src.test.view.MyView android:id="@+id/myView" android:layout_width="fill_parent" android:layout_height="fill_parent" />
    <Button android:text="Button" android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" />
</FrameLayout>

然后在onCreate你只需说

setContentView(R.layout.main_layout);

您可以将按钮放在任何位置,例如,如果您希望它位于底部中心,请使用android:layout_gravity="bottom|center_horizontal"

编辑:

要确保您的自定义视图实现了所有必需的构造函数(其中一些在从xml创建视图时调用),请在eclipse编辑器中打开自定义视图类,然后转到菜单Source - &gt;从超类生成构造函数...

它将帮助您创建构造函数