使用全局变量

时间:2011-06-25 20:42:30

标签: android variables global

我知道这个问题已被问过一百万次因为我已经做了一些研究,并且已经找到了很多线索。我试图在这些线程中使用答案,但我遇到了一些麻烦。

我希望设置一些可以在我的所有活动中使用的变量。

我创建了一个类似于以下内容的GlobalVariables.java类(其中的值仅用于测试目的):

import android.app.Application;

public class GlobalVariables extends Application {

int holeAmount;

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

}

在我发生一切的主要活动中,我有以下内容:

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

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

并在“GlobalVariables global = ...”行中出现以下错误:

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中我需要检索该值。

5 个答案:

答案 0 :(得分:2)

创建一个'helper'类,如下所示......

package com.my.application

public class MyAppHelper {

    private int holeAmount = 0;

    public int getHoles() {
        return holeAmount;
    }

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

然后,对于您的Application类,请执行以下操作...

package com.my.application

public class MyApplication extends Application {

    public static MyAppHelper helper = new MyAppHelper();

}

要访问帮助程序中的get / set方法,只需调用...

即可
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();
    }
}

答案 1 :(得分:0)

您需要导入GlobalVariables。您还需要在清单中的应用程序名称属性中放置GlobalVariables的完整类名称,如下所述: http://developer.android.com/guide/topics/manifest/application-element.html#nm

答案 2 :(得分:0)

如果你这样做

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

从文档中,您不清楚从getApplicationContext()或其他实现中收到实际的应用程序对象。从代码来看,它肯定不会出现。

出于您的目的,您希望获得Application对象,即GlobalVariables。并确保它已在清单中正确注册。


也只是为了确保你有

package com.my.application;

GlobalVariables开始时,不是吗?不要在你的片段中看到它。

答案 3 :(得分:0)

首先要做的事情......

您应该深入考虑是否以及为什么需要全局变量。全局变量应仅用作最后的手段。此外,如果您最终需要使用全局变量,则需要将其记录为死亡,因为不要误会,如果您的应用程序变得复杂,您将失去对其中一个或多个的跟踪。追踪他们是一个严重的PIA !!!

根据我的经验,几乎99%的时间全局变量都被使用,这是因为程序员的懒惰以及他们试图实现的任何事情都可以通过使用编程最佳实践的方式完成。

这是一个例子: https://groups.google.com/forum/#!topic/android-developers/yfI89IElhs8

在不了解您试图在课程之间传递的内容的情况下,除了我提供的内容之外,我不能提供任何其他建议。但是,我相当积极,你可以在不使用任何全局变量的情况下实现所需的目标。

答案 4 :(得分:0)

我已经设置了,并且一直在为我设计的是创建一个公共类,然后使用任何类调用它的上下文来初始化它。我在this链接找到了此信息。这实际上让我可以访问系统服务等内容。然后我继续定义了一些类变量,让我可以调用进出类。但是为了实际处理变量的存储,我使用了SharedPrefrences。 这个设置的好处是我在访问每个变量之前不必为共享的prefrence设置代码。我刚刚通过公共课来做到这一点。 现在记住,我对这个东西是一个完全的新手,我不确定这是最好的方法,或者即使这应该以这种方式完成。但我决定分享我一直在做的事情。所以这里有一些代码:

    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);
    }
}

或者这......

    gt.timeIn(60);//write time in (long) to shared prefrences
    long l = gt.timeOut();//read time out (long) from shared prefrences