结合XML相对布局与表面视图



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

我有一个位图在我的SurfaceView,我想动画和程序化移动。我还想在屏幕上放一个按钮来控制位图的移动。但是由于我不能在SurfaceView中放置按钮,所以我在XML布局中的RelativeLayout中声明了它,该布局名为main.xml。

下面是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。

这是我的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);
    }
}

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

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

注。还没有位图动画代码和按钮控件。我现在解决的只是视图。:)

编辑:

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

这是我编辑的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

感谢您的回复

我觉得你把事情弄得太复杂了。至少,在表面视图上简单地放置一个按钮,你可以像这里所示的那样,通过将按钮放在与表面视图相同的framayout中。

您也可以在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 -> Generate constructors from Superclass…

它将帮助您创建构造函数

最新更新