2011-06-25 23 views
1

私はいくつかの調査を行い、これに関して多くのスレッドを見つけたので、この質問は何百万回も尋ねられました。私はそれらのスレッドで回答を使用しようとしましたが、少し問題があります。グローバル変数を使用する

私はすべてのアクティビティで使用できるいくつかの変数を設定したいと考えています。私の主な活動で

import android.app.Application; 

public class GlobalVariables extends Application { 

int holeAmount; 

public int getHoles(){ 
    return holeAmount; 
    } 
    public void setHoles(String s){ 
    holeAmount = 30; 
    } 

} 

すべては私が持っている次のことを起こっている:(今のようにテスト目的のためだけに存在した値)

は、私は次のようになりますGlobalVariables.javaクラスを作成しました:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    GlobalVariables global = ((GlobalVariables)getApplicationContext()); 
    int totalHoles = global.getHoles(); 

と、私は次のエラー取得しています "GlobalVariablesグローバル= ..." の行に:

Multiple markers at this line 
- GlobalVariables cannot be resolved 
to a type 
- GlobalVariables cannot be resolved 
to a type 

私はここの指示に従おうとしましたが、間違って何かをしています。 >How to declare global variables in Android?

ご協力いただければ幸いです。

ありがとうございます!



二回目:

EasyPar.java(EasyParHelperActivity @エラー)

package com.movi.easypar; 

import java.text.DateFormat; 
import java.util.Date; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.database.Cursor; 
import android.graphics.PixelFormat; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.Window; 
import android.widget.Button; 
import android.widget.ScrollView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class EasyPar extends Activity implements OnClickListener { 

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

(initialize all my buttons and textviews) 
} 

public void someMethod() { 
    EasyParHelperActivity.helper.setHoles(30); 
    int holes = EasyParHelperActivity.helper.getHoles(); 
} 

(the rest of my button functions, etc.) 

EasyParHelperActivity(エラーなし)

package com.movi.easypar; 

import android.app.Application; 

public class EasyParHelperActivity extends Application { 

public static EasyParHelper helper = new EasyParHelper(); 

} 

EasyParHelper.java(エラーなし)

package com.movi.easypar; 

public class EasyParHelper { 

private int holeAmount = 0; 

public int getHoles() { 
    return holeAmount; 
} 

public void setHoles(int holes) { 
    holeAmount = holes; 
} 
} 

ユーザーが最初の画面上のボタン「18」または「9」をクリックできるようにするために、私が欲しいのは、とのためにアプリケーションは、それが何であってもその値を他の時間に使用できるようにする必要があります。だから私は画面1でそれを設定する必要があり、画面2ではその値を取得する必要があります。

+0

エラーのあるアプリケーションまたは最小限のアプリケーションのコード全体を投稿できますか?私はそれが非常に単純なエラー(GlobalVariablesという名前の別のクラスをインポートするなど)であるという強い感情を持っています。 – Augusto

+0

done(名前はちょっと変わりましたが、本質的にはすべてが同じでなければなりません) – Rob

+0

本当に残念です。Rob、私はコードを4回実行しましたが、問題を見つけることができません:( – Augusto

答えて

2

次のように中のget/setメソッドへのアクセスを取得するには、次の...

package com.my.application 

public class MyApplication extends Application { 

    public static MyAppHelper helper = new MyAppHelper(); 

} 

を行うアプリケーションクラスに続いて...

package com.my.application 

public class MyAppHelper { 

    private int holeAmount = 0; 

    public int getHoles() { 
     return holeAmount; 
    } 

    public void setHoles(int holes) { 
     holeAmount = holes; 
    } 
} 

を 'ヘルパー' クラスを作成します。ヘルパーあなたは単に電話することができます...

package com.my.application 

public class MyActivity extends Activity { 

    // Normal onCreate(...) etc here 

    public void someMethod() { 
     MyApplication.helper.setHoles(30); 
     int holes = MyApplication.helper.getHoles(); 
    } 
} 
+0

これを試しましたが、私は取得しています - GlobalVariablesを型に解決できません(メイン変数にGlobalVariables.getHoles()を設定しています)なぜGlobalValues.javaからMainApplication.javaに値を取得したいのですか – Rob

+0

私の主なクラスはアクティビティを拡張します、それは問題になるでしょうか?また、新しいクラス(私のパッケージ>新規>クラスを右クリック)を作成してMyAppHelperを作成し、それをprotectedに変更しようとすると、クラスEasyParHelperのIllegal修飾子というエラーがスローされます。公開、抽象、最終のみが許可されます – Rob

+0

@Rob:私の悪い - ヘルパークラスはパブリックで保護されていないはずです。私は編集します。いいえ、主なクラスがアクティビティを拡張することは重要ではありません。拡張されたアプリケーションとアクティビティの両方が同じパッケージに含まれていることを確認し、Applicationクラスをインポートする必要はありません。私は「ヘルパー」を定期的に使っています。これが私のやり方です。 – Squonk

0

GlobalVariablesをインポートする必要があります。また、あなたはここで説明するようにマニフェストで、アプリケーションのname属性でGlobalVariablesの完全なクラス名を配置する必要があります:あなたはドキュメントから

GlobalVariables global = ((GlobalVariables)getApplication()); 

をすれば、それはあなたがgetApplicationContext()から、実際のアプリケーションオブジェクトを受け取る明確ではない何 http://developer.android.com/guide/topics/manifest/application-element.html#nm

+0

私はすでにマニフェストにGlobalVariablesを追加しました。 – Rob

+0

同じパッケージになっていますか?Eclipseでプロジェクトを閉じて開くことをお勧めします(またはリフレッシュする) –

+0

インポートリストに追加しようとすると、 import com.my.application.GlobalVariables;それはimport com.my.applicaiton.GlobalVariablesを解決できないと言います。これは、偶然にではなく、その拡張アプリケーションのためですか? – Rob

0

または他のいくつかの実装である。コードからは明らかにそうは見えません。

しかし、あなたのApplicationオブジェクトはGlobalVariablesになります。マニフェストに正しく登録されていることを確認してください。


また、ちょうどあなたが、GlobalVariablesの初めに

package com.my.application; 

をしていない持っていることを、確認してくださいするには?あなたのスニペットでそれを見ないでください。そして、なぜあなたはグローバル変数を必要とするかもしれない場合は、最初の...

あなたは深く検討する必要があります

+0

com.my.applicationというパッケージがありますが、最初はGlobalVariables.javaファイルにエラーはありません。あなたは上記とまだサイコロを言及していないものを試してみました:(私はこのラインで複数のマーカーを取得 \t - GlobalVariablesは型に \tを解決することはできません \t - GlobalVariablesはタイプどこでも – Rob

0

初のもの。グローバル変数は、最後の手段としてのみ使用する必要があります。さらに、グローバル変数を使用する必要が生じた場合は、間違いを起こさないように文書化する必要があります。アプリが複雑になると、それらのうちの1つ以上を追跡できなくなります。それらを追跡することは重大なPIAです!

プログラマーの怠惰のためにグローバル変数が使用されている時間はほぼ99%であり、達成しようとしていることはプログラミングのベストプラクティスを使用した方法で行われている可能性があります。 https://groups.google.com/forum/#!topic/android-developers/yfI89IElhs8

あなたは、クラス間を通過しようとしているかについての詳細を知らなくても、私は私が提供したもの以外の他のアドバイスを提供することはできません。ここで

は一例です。しかし、私はあなたがグローバル変数を使用せずに探しているものを達成できることはかなりポジティブです。

+0

I国連 \tを解決することはできません何かがうまくいかない場合、重大な混乱についてあなたが言っていることを理解する。しかし、私が避けようとしているのは、1つを変更すると、各変数を複数回編集する必要があるということです。代わりに私はむしろ1つの場所でそれを変更し、それが使用されているアプリケーション全体を変更するようにします。問題を引き起こす可能性のある値については、グローバル変数を使用しない可能性があります。 – Rob

+1

次に、私はこのために文字列リソースファイルを使用することをお勧めします。たとえば、SharedPreferencesを使用し、キー/値のペアのキーに対して、グローバルに使用できるため、文字列リソースを使用します。したがって、this.mSharPref.getInt(this.getString(R.string.somevalue)、0)のようになります。 – rf43

+0

@Rob btw他のすべての答えは実行可能ですが、もしあなたがこれのために文字列prefsを使う道を行くなら、あなたはそれが** WAY **であり、** WAY **が維持しやすいことがわかります。また、Androidに仕事をさせてもらうことの利点があります。オブジェクトの作成/解放。 – rf43

0

私が設定していることは、単に出版を作成することですicクラスを呼び出し、それを呼び出したクラスのコンテキストから初期化します。私はこれをthisというリンクで見つけました。これにより、実際にはシステムサービスのようなものにアクセスできるようになりました。私は先に進んで、私がクラスを呼び出すことができるいくつかのクラス変数を定義しました。しかし、変数の格納を実際に処理するために、私はSharedPrefrencesを採用しました。 この設定の良い点は、各変数にアクセスする前に、共有プリフォースのコードを設定し続ける必要がなかったことです。私はちょうど公のクラスを通してそれをやった。 ここで、私はこのようなことについて完全に初心者であり、これが最良のアプローチであるかどうか、あるいはこれが全くこのように行われるべきかどうかはわかりません。しかし、私は同じことをすべて同じことを分かち合うことに決めました。ここにいくつかのコードがあります:

package com.example.someapp; 

    import android.app.PendingIntent; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.content.SharedPreferences; 

    public class GlobalThing { 

Context me; 
SharedPreferences appdata; 

public GlobalThing(Context me) { 
    this.me = me; 
    appdata = me.getApplicationContext().getSharedPreferences(
      "ApllicationData", 0); 
} 

public boolean alarmRunning() { 
    boolean b; 
    Intent i = new Intent(me, AlarmThing.class); 
    b = (PendingIntent.getBroadcast(me, 0, i, PendingIntent.FLAG_NO_CREATE) != null); 
    if (b) { 
     return true; 
    } else { 
     return false; 
    } 
} 

public void timeIn(long time){ 
    SharedPreferences.Editor timeVar = appdata.edit(); 
    timeVar.putLong("time delay", time); 
    timeVar.commit(); 
} 
public long timeOut(){ 
    return appdata.getLong("time delay", 0); 
} 
    } 

上記は実際のグローバルクラスです。これはマニフェストなどで宣言されません。

 public class SmokeInterface extends Activity implements OnClickListener { 

GlobalThing gt; 
boolean bool; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_smoke_interface); 
      gt = new GlobalThing(this); 
       setalarm(); 
     } 

そして、このような変数にアクセス:その後、私は活動のこのような何かをコーディングし、このクラス内の変数にアクセスするには

 private void setAlarm() { 
    bool = gt.alarmRunning(); 
    if (bool) { 
     Toast.makeText(this, "Alarm is already running.", 
       Toast.LENGTH_SHORT).show(); 
    } else { 
     AlarmManager m = (AlarmManager) getSystemService(ALARM_SERVICE); 
     Intent i = new Intent(this, AlarmThing.class); 
     PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 
       PendingIntent.FLAG_CANCEL_CURRENT); 
     Calendar time = Calendar.getInstance(); 
     time.setTimeInMillis(System.currentTimeMillis()); 
     time.add(Calendar.SECOND, 10); 
     m.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pi); 
    } 
} 

またはこれを...

関連する問題