Объединить XML RelativeLayout с представлением поверхности - PullRequest
1 голос
/ 28 октября 2011

Я новичок в разработке приложений для Android и хотел бы кое-что спросить.

У меня есть растровое изображение внутри моего SurfaceView, которое я хочу анимировать и перемещать программно.Я также хочу поставить кнопку на экране, чтобы контролировать перемещение растрового изображения.Но поскольку я не могу поместить кнопку в SurfaceView, я объявил ее в RelativeLayout в своем XML-макете с именем 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 с Layout, который находится в моем 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);
    }
}

, но он выдает ошибку «приложение неожиданно остановлено».Я делаю это неправильно?Если да, можете ли вы предложить лучший способ реализации этого?

Ваш ответ очень важен.Спасибо!

ps пока нет кодов растровой анимации и кнопок управления.Это просто взгляды, которые я сейчас решаю.:)

РЕДАКТИРОВАТЬ:

Я отредактировал свои коды и вот он:

так вот мой отредактированный 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 Ответ

3 голосов
/ 28 октября 2011

Я думаю, вы слишком усложняете это для себя. По крайней мере, чтобы просто поместить кнопку поверх SurfaceView, визуально вы можете сделать что-то вроде того, что показано здесь , поместив кнопку в тот же FrameLayout, что и вид поверхности.

Вы также можете объявить свой пользовательский вид в 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".

EDIT:

Чтобы убедиться, что в вашем пользовательском представлении реализованы все необходимые конструкторы (некоторые из которых вызываются при создании представлений из xml), откройте свой пользовательский класс представлений в редакторе eclipse и перейдите в меню Source -> Generate Constructors from Superclass ...

Это поможет вам создавать конструкторы

...