【问题标题】:How to use my SurfaceView with main.xml on Android?如何在 Android 上将 SurfaceView 与 main.xml 一起使用?
【发布时间】:2011-10-18 18:23:16
【问题描述】:

在我项目的主类中,我有

public class MyClass extends Activity{
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        mySurfaceView = new MySurfaceView(this);
        setContentView(mySurfaceView); 
        ...
    }

    class MySurfaceView extends SurfaceView implements Runnable{
       ...
    }
}

我想在这个程序中添加按钮和轮子,我现在在一个单独的小程序中使用 main.xml 文件。我知道要访问它,我必须使用 setContentView(R.layout.main) 行,但是随后我无法访问我的 SurfaceView。我怎样才能做到两者兼得?我在网上看到一些关于使用 FrameLayout 添加几行的内容,但我不知道在哪里,我尝试将它粘贴在 main.xml 中的各个位置,但这只会导致我的整个程序中断..

目前我的 main.xml 看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
 <Button android:id="@+id/selectButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="Select Time Interval"
android:onClick="selfDestruct"
/>
<Button android:id="@+id/finishButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="Done"
android:visibility="gone"
android:onClick="selfDestruct"
/>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_gravity="top|left"
    android:paddingLeft="12dp"
    android:paddingRight="12dp"
    >
    <kankan.wheel.widget.WheelView android:id="@+id/startHour"
        android:visibility="gone"
        android:layout_height="wrap_content"
        android:layout_width="43dp"/>
    <kankan.wheel.widget.WheelView android:id="@+id/startMins"
        android:visibility="gone"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
        <kankan.wheel.widget.WheelView android:id="@+id/startAmpm"
        android:visibility="gone"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent" >
        <TextView android:id="@+id/theWordTo"
            android:visibility="gone"
            android:layout_width="wrap_content" 
            android:layout_height="fill_parent"
            android:gravity="center"
            android:text="   to   "/>
        </LinearLayout>

        <kankan.wheel.widget.WheelView android:id="@+id/endHour"
        android:visibility="gone"
        android:layout_height="wrap_content"
        android:layout_width="43dp"
        />
    <kankan.wheel.widget.WheelView android:id="@+id/endMins"
        android:visibility="gone"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
        <kankan.wheel.widget.WheelView android:id="@+id/endAmpm"
        android:visibility="gone"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
</LinearLayout>

</LinearLayout>

【问题讨论】:

    标签: android xml surfaceview


    【解决方案1】:

    我想你想使用FrameLayout。将 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"
    >
    <kankan.current.app.MyClass.MySurfaceView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/surfaceView" />
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
     <Button android:id="@+id/selectButton"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:text="Select Time Interval"
    android:onClick="selfDestruct"
    />
    <Button android:id="@+id/finishButton"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:text="Done"
    android:visibility="gone"
    android:onClick="selfDestruct"
    />
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_gravity="top|left"
        android:paddingLeft="12dp"
        android:paddingRight="12dp"
        >
        <kankan.wheel.widget.WheelView android:id="@+id/startHour"
            android:visibility="gone"
            android:layout_height="wrap_content"
            android:layout_width="43dp"/>
        <kankan.wheel.widget.WheelView android:id="@+id/startMins"
            android:visibility="gone"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"/>
            <kankan.wheel.widget.WheelView android:id="@+id/startAmpm"
            android:visibility="gone"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"/>
    
            <LinearLayout
                android:orientation="vertical"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent" >
            <TextView android:id="@+id/theWordTo"
                android:visibility="gone"
                android:layout_width="wrap_content" 
                android:layout_height="fill_parent"
                android:gravity="center"
                android:text="   to   "/>
            </LinearLayout>
    
            <kankan.wheel.widget.WheelView android:id="@+id/endHour"
            android:visibility="gone"
            android:layout_height="wrap_content"
            android:layout_width="43dp"
            />
        <kankan.wheel.widget.WheelView android:id="@+id/endMins"
            android:visibility="gone"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"/>
            <kankan.wheel.widget.WheelView android:id="@+id/endAmpm"
            android:visibility="gone"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"/>
    </LinearLayout>
    
    </LinearLayout>
    
    </FrameLayout>
    

    然后在活动中:

    public class MyClass extends Activity{
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main); 
            mySurfaceView = (MySurfaceView) findViewById(R.id.surfaceView);
        }
    
        class MySurfaceView extends SurfaceView implements Runnable{
           ...
        }
    }
    

    【讨论】:

    • 我几乎花了两天半的时间思考我是如何做到这一点的,并且在谷歌搜索中使用正确的关键字我登陆了这里!非常感谢先生。
    【解决方案2】:

    当然可以在运行时将 SurfaceView 添加到布局中(例如在 onCreate() 方法中),但将其添加到 XML 布局中可能要简单得多。

    为简单起见,我将首先在其自己的文件中定义 MySurfaceView,而不是在与您的 MyClass Activity 相同的文件中。确保包含MySurfaceView(Context context, AttributeSet attrs) 形式的构造函数,以便视图可以正确膨胀。然后只需将以下内容插入到您想要的 XML 布局中。

    <com.example.package.MySurfaceView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>
    

    其中第一行是 MySurfaceView 的路径(com.example.package 是包名称,MySurfaceView 是您在其中定义自定义视图的文件)。

    【讨论】:

      猜你喜欢
      • 2021-10-21
      • 2016-12-09
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-04
      • 2012-03-18
      相关资源
      最近更新 更多