2012-02-02 8 views
3

私はプログラミング言語の経験はありますが、アンドロイドプログラミングには少し慣れています。Android;クラス本体でのedittextの宣言(どのメソッドからでも)

私はラベル(テキストビュー)、ボタン、およびデータ入力(edittext)として機能するいくつかのフィールドを持つプログラムを持っています。

私はアプリケーションの起動時に、(もちろんクラス内の)どのメソッドからでもプログラムの冒頭に宣言すると、クラッシュし、シミュレーションは "残念なことに、あなたのプログラムは停止しました"という警告を出します。

Eclipseは宣言にエラーを与えません。私は問題のない通常の変数を定義するために同じ方法を使用しました。また、クラス本体にmediaplayerオブジェクトを宣言すると、同じエラーが発生します。

誰にエラーが発生するのですか? そして、edittext、viewtextなどのグローバルオブジェクトを宣言する別の方法があります...それらを何度も繰り返し宣言すると、私には奇妙な音がします。

ありがとうございました!

パブリッククラスTrainerActivityアクティビティ{

Button stopTimer = (Button)findViewById(R.id.StopTimer); 
Button startTimer = (Button)findViewById(R.id.StartTimer); 
EditText totalTime = (EditText)findViewById(R.id.TotalTime); 
EditText enterMin = (EditText)findViewById(R.id.EnterMin); 
EditText enterSec = (EditText)findViewById(R.id.EnterSec); 

private boolean breaker = false; 

@Override 

public void onCreate(Bundle savedInstanceState) 
{ 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 


    startTimer.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Button_StartTimer(); 
     } 
    }); 

    stopTimer.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Button_StopTimer(); 
     } 
    }); 
} 

答えて

0

を拡張し、あなたは問題を示すサンプルコードのビットを投稿することができますか?クラス内のEditTextまたはTextViewであるメンバ変数を宣言するのは良いことです。

logcat(DDMSで)には、エラーに関する情報も表示する必要があります。 Eclipseを使用している場合はDDMS用のタブがありますが、コマンドラインからDDMSを実行してlogcatタブを見てアプリを起動することはできます(電話はusb経由でプラグインされています)。報告されている実際のエラーを参照してください。

0

これらの変数は、クラス本体内またはメソッド本体内で宣言できます。前者の場合、変数はグローバルであるため、クラス全体でアクセスすることができます。後者の場合、それらはローカルなので、そのメソッド内でしかアクセスできません。それらの両方は、一般的にはプロラミングで見ることができます。

Androidの典型的なアプリケーションは、クラス本体で変数を宣言し、onCreate()メソッドでインスタンス化することです。このような何か:

public Class MyClass extends Activity{ 

    TextView label;// so this variable can be accessed within any methods in this Class 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(Bundle savedInstanceState); 
      setContentView(R.layout.main) // load the layout of the activity 
      label=(TextView)findViewById(R.id.<the TextView id defined in the layout file>); //this variable get instantiated. From now on you can manipulate it anywhere inside the class. 
     Button submit=(Button)findViewById(R.id.<the Button id defined in the layout file>);//you declared and instantiated it, but it could only be used within this method since you declared it here. 

} 


    } 

あなただけのクラス本体内の変数を宣言する場合、それらはインスタンス化する前にnullあるので、あなたは、それをインスタンス化するまで、ほとんどのcaesesに、あなたがそれを使用することはできません。私はこれがあなたに問題がある理由だと思う。本当の問題を特定できるようにlogcatを投稿してください。

7

あなたがしようとしていることの例のコードを見ることなく、明確に言うことは不可能です(ここでは気にしません)。あなたはこのような何かをやっているあなたはsetContenetView(...)を呼び出す前に、あなたがfindViewById(...)を使用し、その結果として、tv2はnullになりますので、しかし、私は推測してみましょう、?...

public class MyActivity extends Activity { 

    TextView tv1; // This is fine. 
      TextView tv2 = (TextView) findViewById(R.id.textview2); // Don't do this. 

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

     tv1 = (TextView) findViewById(R.id.textview1); // This is fine 
     tv1.setText("Some text"); // This works 

     tv2.setText("Some text"); // NullPointerException here 

    } 
} 

tv2.setText(...)は失敗します。

Activityでウィジェットをインスタンスメンバーとして宣言することは可能ですが、コンテンツビューを設定するまではfindViewById(...)を使用しないでください。ウィジェットを宣言

+0

良い推測バディ:)私がしようとしていましたfindViewByIdを使用します。問題は、自分のメソッドで同じオブジェクトを何度も何度もやり直して使用したくないということです。 OnCreateでそれらを開始すると、言語制限のためにOnCreateで開始されます。ここで何かが見つからない場合は修正してください。この場合、xmlオブジェクトを作成してグローバルに開始することは可能ですか? MisterSquonkが提供したサンプルコードは、私がやっていたものです。 –

+0

'onCreate(...) 'で' findViewById(...) 'を呼び出すと、' Activity'のスコープ内のさまざまなオブジェクトを指し続けるでしょう。言い換えれば、MyActivityが破棄されるまで、上記のコード内の 'tv1'は' MyActivity'のすべてのメソッドに対して有効です。 – Squonk

0

試してみるだけのonCreate()メソッド

Button stopTimer; 
Button startTimer; 
EditText totalTime; 
EditText enterMin; 
EditText enterSec; 

外の名前をオブジェクト、その後のonCreate内部setContentView()(後にそれらを初期化)

setContentView(R.layout.main); 
stopTimer = (Button)findViewById(R.id.StopTimer); 
startTimer = (Button)findViewById(R.id.StartTimer); 
totalTime = (EditText)findViewById(R.id.TotalTime); 
enterMin = (EditText)findViewById(R.id.EnterMin); 
enterSec = (EditText)findViewById(R.id.EnterSec); 
+0

これは、基本的には、グローバルにアクセスできることを明確にしていますか? –

関連する問題