-1

私はプログラミングとAndroidが初めてです。お金を数える小さなアプリを作成しました。現時点では、多くのメソッドを含む 1 つの大きなファイルにすぎません。それで、少し整理して、クラスに入れようと思いました。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 が発生してアプリがクラッシュします。しばらく探していましたが、始めたときよりも多くの疑問が残りました。setContentView() を設定していないため、メイン アクティビティ以外で findViewById を使用できないようです。それは主な活動ではないので、私はしません。また、単純なトーストを別のクラスに入れて呼び出しようとしましたが、それもクラッシュします。だから私はそれを正しくしていません。

Androidでクラスを正しく使用する方法について、誰かが私にいくつかの指針を喜んで教えてくれますか?

乾杯、

大安

4

2 に答える 2

0

これは Android に関するものではなく、純粋に Java に関するものです。インスタンスがどのように連携するかを理解する必要があります。

ClearAll インスタンスには何も含まれていません。

clearAll メソッドは、それが機能するスコープ内にある必要があります。スコープが現在のアクティビティであることを示す findViewById を使用します。

現在のアクティビティは、ClearAll を呼び出した場所からの MainActivity のインスタンスです (推測します)。

いくつかのオプションがあります:

  1. MainActivity に clearAll を戻す
  2. ClearAll をアクティビティを拡張する抽象クラスにします。MainActivity が ClearAll を拡張するようにします。MainActivity から呼び出すことができるようになりましたthis.clearAll()
  3. ClearAll を何も拡張しない抽象クラスにします。アクティビティをパラメーターとして受け取る静的メソッドを clearAll にします。このパラメーターを使用して、findViewById を呼び出します。MainActivity から ClearAll.clearAll(this) を呼び出すことができるようになりました

オプション 1 をお勧めします。このメソッドを複数のクラスで使用する場合は、オプション 2 と 3 をお勧めします。

また、コード量の削減、さらに重要なことに重複行の削減に関しては、EditText の ID と TextView の別の ID のコレクション (配列、リストなど) を作成し、このコレクションをループすることをお勧めします。内容をクリアします。

次のようなもの (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 に答える