-1

我是编程和 Android 新手。我已经构建了一个用于数钱的小应用程序。目前它只是一个大文件,其中包含许多方法。所以我想我会整理一下,然后去上课。我有这个 clearAll 方法,我把它放在一个 ClearAll 类中:

import android.widget.EditText;
import android.widget.TextView;

public class ClearAll extends MainActivity {

    public void clearAll() {
        // Set EditTexts to ""
        ((EditText) findViewById(R.id.euro500)).setText("");
        ((EditText) findViewById(R.id.euro200)).setText("");
        ((EditText) findViewById(R.id.euro100)).setText("");
        ((EditText) findViewById(R.id.euro50)).setText("");
        ((EditText) findViewById(R.id.euro20)).setText("");
        ((EditText) findViewById(R.id.euro10)).setText("");
        ((EditText) findViewById(R.id.euro5)).setText("");
        ((EditText) findViewById(R.id.euro2)).setText("");
        ((EditText) findViewById(R.id.euro1)).setText("");
        ((EditText) findViewById(R.id.cent50)).setText("");
        ((EditText) findViewById(R.id.cent20)).setText("");
        ((EditText) findViewById(R.id.cent10)).setText("");
        ((EditText) findViewById(R.id.cent5)).setText("");
        ((EditText) findViewById(R.id.cent2)).setText("");
        ((EditText) findViewById(R.id.cent1)).setText("");

        // Set TextViews to "0.00"
        ((TextView) findViewById(R.id.tvEuro500Totaal)).setText(R.string.puntjes);
        ((TextView) findViewById(R.id.tvEuro200Totaal)).setText(R.string.puntjes);
        ((TextView) findViewById(R.id.tvEuro100Totaal)).setText(R.string.puntjes);
        ((TextView) findViewById(R.id.tvEuro50Totaal)).setText(R.string.puntjes);
        ((TextView) findViewById(R.id.tvEuro20Totaal)).setText(R.string.puntjes);
        ((TextView) findViewById(R.id.tvEuro10Totaal)).setText(R.string.puntjes);
        ((TextView) findViewById(R.id.tvEuro5Totaal)).setText(R.string.puntjes);
        ((TextView) findViewById(R.id.tvEuro2Totaal)).setText(R.string.puntjes);
        ((TextView) findViewById(R.id.tvEuro1Totaal)).setText(R.string.puntjes);
        ((TextView) findViewById(R.id.tvCent50Totaal)).setText(R.string.puntjes);
        ((TextView) findViewById(R.id.tvCent20Totaal)).setText(R.string.puntjes);
        ((TextView) findViewById(R.id.tvCent10Totaal)).setText(R.string.puntjes);
        ((TextView) findViewById(R.id.tvCent5Totaal)).setText(R.string.puntjes);
        ((TextView) findViewById(R.id.tvCent2Totaal)).setText(R.string.puntjes);
        ((TextView) findViewById(R.id.tvCent1Totaal)).setText(R.string.puntjes);

        ((TextView) findViewById(R.id.tvTotaalBedrag)).setText(R.string.puntjes);
    }
}

所以在我的 MainActivity 我做:

ClearAll clear = new ClearAll();
clear.clearAll();

但是,当调用它时,应用程序会在 findViewById 上出现 NullPointerException 崩溃。我一直在寻找一段时间,它给我留下了比我开始时更多的问题。似乎您不能在主要活动之外使用 findViewById,因为您尚未设置 setContentView()。我不会这样做,因为它不是主要活动。我还尝试将一个简单的 toast 放在一个单独的类中并调用它,但这也会崩溃。所以我只是做得不对。

有人愿意给我一些关于如何在 Android 中正确使用类的指示吗?

干杯,

大安

4

2 回答 2

0

您需要在 onCreate() 中有 setContentView(R.layout.activity_main) 然后通过 findViewById() 获取 id,然后将文本设置为 null。

由于您尚未设置布局,因此您无法通过 findViewById() 获取 id。因此您会收到 nullpointerexception。

  public class MainActivity extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
            clearAll();
           }
       public void clearAll() {
         // Set EditTexts to ""
         ((EditText) findViewById(R.id.euro500)).setText("");
         ((EditText) findViewById(R.id.euro200)).setText("");

           }

   }
于 2013-04-11T15:46:34.357 回答
0

这不是关于android,这纯粹是关于java。您必须了解实例如何协同工作。

您的 ClearAll 实例不包含任何内容。

您的 clearAll 方法必须在其工作范围内。它使用 findViewById,表示范围应该是当前活动。

当前活动是(我猜)您调用 ClearAll 的 MainActivity 实例。

有几种选择:

  1. 在 MainActivity 中放回 clearAll
  2. 使 ClearAll 成为扩展 Activity 的抽象类。使 MainActivity 扩展 ClearAll。从 MainActivity,您现在可以调用this.clearAll()
  3. 使 ClearAll 成为一个不扩展任何东西的抽象类。使 clearAll 成为一个以 Activity 作为参数的静态方法。使用此参数调用 findViewById 就可以了。您现在可以从 MainActivity 调用 ClearAll.clearAll(this)

我推荐选项 1。如果您将在多个课程中使用此方法,则首选选项 2 和 3。

此外,关于减少代码量,更重要的是,减少重复行,我建议为 EditText 和 TextView 制作一个 id 的 Collection (array, list ...),并在此集合上循环以清除内容。

类似于(在 MainActivity 中):

private final static int[] EDIT_IDS = new int[] {R.id.euro500, ... }
private final static int[] TEXT_IDS = new int[] {R.id.tvEuro500Totaal, ... }

private void clearAll() {
    for (int id : EDIT_IDS) {
        ((EditText) findViewById(id)).setText("");
    }
    for (int id : TEXT_IDS) {
        ((TextView) findViewById(id)).setText(R.string.puntjes);
    }
}
于 2013-04-11T15:58:46.730 回答