在经典在线教程中找到构建 Android 项目的正确文件

Finding the Right Files to Build Android Project in Classic Online Tutorial

我在学习本教程的第 7 周时遇到问题,https://web.stanford.edu/class/cs193a/lectures.shtml。在第 7 周,当我 运行 在 Android studio 上构建时,只有 .java 文件显示有问题。

我是否需要 xml 文件?为什么不能显示它们,因为在前几周还显示了 xml 文件。

我打开了 Targets 应用程序的 zip 文件并在 Targets/app/src/main/res/layout 中找到了以下 xml 文件,

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".TargetsActivity">

    <com.example.stepp.targets.TargetsView
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

但是当我将它复制到粘贴 .java 文件的项目中时,ExampleView.java 和 TargetsView.java、

 /*
 * CS 193A, Winter 2015, Marty Stepp
 * This class is a graphical view of a basic example of 2D graphics.
 */

package com.example.stepp.targets;

import android.content.Context;
import android.graphics.*;
import android.util.AttributeSet;
import android.view.View;

public class ExampleView extends View {
    public ExampleView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /*
     * This method draws some shapes and text on the view.
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawARGB(255, 255, 90, 90);

        Paint aqua = new Paint();
        aqua.setARGB(255, 0, 80, 220);

        canvas.drawRect(new RectF(10, 30, 300, 700), aqua);
        canvas.drawOval(new RectF(400, 50, getWidth(), getHeight()), aqua);

        Paint font = new Paint();
        font.setARGB(255, 0, 0, 0);
        font.setTypeface(Typeface.create(Typeface.SERIF, Typeface.BOLD_ITALIC));
        font.setTextSize(40);

        canvas.drawText("CS 193A is great", 80, 200, font);
    }
}

    /*
 * CS 193A, Winter 2015, Marty Stepp
 * This class is a graphical view of a drawing of a red/white target figure.
 */

package com.example.stepp.targets;

import android.content.Context;
import android.graphics.*;
import android.util.AttributeSet;
import android.view.View;

public class TargetsView extends View {
    public TargetsView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /*
     * This method draws the target oval shapes on the view.
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Paint red = new Paint();
        red.setARGB(255, 255, 0, 0);

        Paint white = new Paint();
        white.setARGB(255, 255, 255, 255);

        int w = getWidth();
        int h = getHeight();

        for (int i = 0; i < 5; i++) {
            canvas.drawOval(new RectF(w*i/10, h*i/10, w*(10-i)/10, h*(10-i)/10), (i % 2 == 0 ? red : white));
        }
    }
}

我不明白为什么这不起作用,因为同样的方法在前几周起作用。非常感谢您的帮助。我也不明白为什么需要两个不同的活动 ExampleView 和 TargetsView。

我在本教程的后几周遇到了同样的问题,因为我看不到在哪里可以找到正确的 java 和 xml 文件。

这个问题似乎是那些遵循 android 应用程序开发

重要教程的人的常见错误

尝试使用整个 Targets.zip。

您在问题中包含的两个 class 是 class extends View。它们只是 UI 组件,不会自行发生任何事情。

这两个 class 可以包含在布局 xml 中或由 Activity class 使用(以编程方式构建)。正如您在找到的布局 xml 中看到的那样,它包含一个名为 <com.example.stepp.targets.TargetsView ... /> 的标记,这意味着此布局将在其中包含一个 TargetView。

Activity class 实际上是协调 UI 组件和逻辑的人。在你的 Targets.zip 中,你也有一个 TargetsActivity.java,这是一个 Acitivity class。它尝试通过在 onCreate() 方法中调用 setContentView(...) 来获取 R.layout.activity_targets 并将其设置为内容视图。

src/main 终于有 AndroidManifest.xml 了。可以看到在<activity ...> ... </activity>节点中,TargetsActivity被指定为launcheractivity,也就是说app启动时,这个Acitivityclass会是第一个activity 开始。