如何在活动中创建视图?

时间:2016-06-13 22:55:13

标签: java android

我的目标是在移动屏幕中心创建一个简单的球,这样我就可以在他们拖动手指时在屏幕上移动它。

为此我想使用Canvas和位图(我不知道它是否是最好的方式,因为已经说过我是Android世界的新手)。

我在Activity中创建了一个函数,这样当单击一个按钮时,会创建一个包含画布设计脚本的活动(再次不知道它是否是最好的方法。在php脚本或javascript中我会创建球在功能本身)。我的代码如下:

public void StartGame(View v)  {
       Intent i = new Intent(MainActivity.this, ball.class);
       startActivity(i);
    }

通过这样做,它应该调用以下活动:

com.teste package;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.view.View;
    
    
    public class ball extends View {
    
        Paint pincelPreto private;
        Paint pincelAmerelo private;
    
        Public ball (Context context) {
            super (context);
        }
    
        Public ball (Context context, attributeSet attrs) {
            super (context, attrs);
    
            setBackgroundColor (Color.LTGRAY);
            pincelPreto = new Paint ();
            pincelPreto.setColor (Color.BLACK);
            pincelAmerelo = new Paint ();
            pincelPreto.setColor (Color.YELLOW);
    
            setFocusable (true);
        }
    
        @Override
        protected void onDraw (Canvas canvas) {
            super.onDraw (canvas);
    
            canvas.drawCircle (200, 200, 200, pincelAmerelo);
        }
    }

两个人都在每个位置画一个球...... 但是我收到以下错误:

Android.content.ActivityNotFoundException:无法找到显式活动类{com.teste / com.teste.ball};你有没有在AndroidManifest.xml中声明这个活动?

我做错了什么?

OBS:我可能会打电话给活动,因为我不知道它的真实名称。

3 个答案:

答案 0 :(得分:0)

如果要创建活动,则需要通过Activity类扩展它。通过扩展视图,您可以创建自定义视图,您可以在xml中使用,也可以在活动或片段中动态使用。例如ImageView,TextView,EditText,All layouts扩展View,您可以在活动中使用或通过xml或动态分段。

答案 1 :(得分:0)

扩展Neo上面的答案并给出您编辑过的问题:

你获得Android.content.ActivityNotFoundException的原因是因为“ball”是一个View而不是一个Activity,所以你不能将“ball”作为一个活动开始。

public void StartGame(View v)  {
    Intent i = new Intent(MainActivity.this, ball.class);
    startActivity(i);
}

由于您不熟悉Android,因此请尝试将Activity可视化为通常占据整个屏幕的组件,并将View视为较小的一部分。您希望您的球在活动中显示

res/layout文件夹中,您应该拥有MainActivity的布局xml文件。你可以在这里添加一些xml的球视图,类似于以下内容:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.teste.ball
        android:id="@+id/ball"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </com.teste.ball>
</LinearLayout>

一旦你到目前为止,你可能会遇到其他问题,但它应该更容易调试。

我同意上面的评论,在进入复杂的应用程序之前先学习基础知识。查看Android Developer页面,了解组件并尝试简单的教程。有很多组件构成了Android应用程序并完全理解它们以及它们如何相互交互将使您的生活更轻松:)。祝你好运,欢迎来到Android!

编辑以回答下面的问题...我能用java做吗?我搜索了一些关于“膨胀”视图的内容,但我不知道它是否正确?

是的,您可以使用addView向Activity的父布局添加视图。 Inflate用于将XML中的视图实例化为Java对象,因此在您的情况下它不起作用,因为您没有Ball布局的xml文件。您需要创建一个新的Ball对象并使用addView将其添加到您的布局中:

LinearLayout layout = findViewById(R.id.main);

Ball ball = new Ball(this);
ball.setLayoutParams(new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT,
    LinearLayout.LayoutParams.WRAP_CONTENT));

layout.addView(ball);

其中layout是在活动的XML中找到的父布局。如果你还没有,你可能需要为它分配一个ID,所以如果我们使用上面的例子,你的LinearLayout标签将如下所示:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

答案 2 :(得分:0)

正如其他人所说,Ball延伸View,而不是Activity。要使用startActivity()方法,您需要将Activity传递给它。首先创建BallView

package com.test.myapplication;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class BallView extends View {

    private final Paint pincelPreto;
    private final Paint pincelAmerelo;

    public BallView(final Context context) {
        super(context);

        setBackgroundColor(Color.LTGRAY);
        pincelPreto = new Paint();
        pincelPreto.setColor(Color.BLACK);
        pincelAmerelo = new Paint();
        pincelAmerelo.setColor(Color.YELLOW);
    }

    @Override
    protected void onDraw(final Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawCircle(200, 200, 200, pincelAmerelo);
    }
}

然后创建一个BallActivity。它包含一个Java类和一个放在res/layout/activity_ball.xml下的XML资源。下面是一个示例XML资源:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="match_parent">

    <com.test.myapplication.BallView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:focusable="true"/>
</FrameLayout>

BallActivity类:

package com.test.myapplication;

import android.app.Activity;
import android.os.Bundle;

public class BallActivity extends Activity {

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ball);
    }
}

为了启动BallActivity,最后需要做的就是将其添加到AndroidManifest.xml(否则您将继续获得ActivityNotFoundException):

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.test.myapplication"
          xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name=".BallActivity"/>
    </application>

</manifest>

希望这有帮助。