我是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
感谢您的回复
答案 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;从超类生成构造函数...
它将帮助您创建构造函数