2011-10-28 85 views
1

我是Android應用程序開發的新手,我想問一些問題。將XML RelativeLayout與Surface View結合使用

我有我的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 .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); 
    } 
} 

,但它給了我一個「應用程序已意外停止」錯誤。我做錯了嗎?如果是這樣,你能提出一個更好的實現方法嗎?

您的回覆非常感謝。謝謝!

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 

感謝您迴應

回答

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編輯器自定義視圖類,並進入菜單源 - >生成從超類構造函數...

它會幫助你創建構造

+0

感謝您的答覆,我想你的代碼,但我仍然得到同樣的錯誤。我跟着你的xml代碼,只需額外的按鈕,並將'setContentView(_myXmlLayout)'改爲'setContentView(R.layout.main)'。我錯過了什麼嗎?謝謝 – src

+0

請在你的問題中發佈logcat的輸出與你的異常棧跟蹤 – Craigy

+0

我編輯了我的原始帖子,包括logcat。謝謝 – src