使用全局变量



我知道这个问题已经被问了一百万次了,因为我做了一些研究,发现了很多关于这个问题的线索。我试着在这些线索中使用答案,但我遇到了一些麻烦。

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

我创建了一个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

我试着按照这里的说明操作,但很明显我做得不对。>如何在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中我需要检索这个值。

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

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

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

首先。。。

你应该深入考虑是否以及为什么你可能需要一个全局变量。全局变量只能作为最后手段使用。此外,如果你最终需要使用全局变量,你需要将它们记录下来,因为毫无疑问,如果你的应用程序变得复杂,你将失去对其中一个或多个变量的跟踪。追踪他们是一个严重的PIA!!!

根据我的经验,几乎99%的时候使用全局变量都是因为程序员的懒惰,他们试图实现的任何目标都可以通过使用编程最佳实践的方式来实现。

以下是一个示例:https://groups.google.com/forum/#!主题/安卓开发者/yfI89IElhs8

如果不了解你在课堂之间试图传递的信息,我就无法提供除我所提供的之外的任何其他建议。然而,我非常肯定,你可以在不使用任何全局变量的情况下实现你想要的目标。

如果你做怎么办

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

从文档中,还不清楚您是否收到了来自getApplicationContext()或其他实现的实际应用程序对象。从代码上看,它肯定不是这样的。

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


也只是为了确保,你有

package com.my.application;

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

我所设置的,一直在为我工作的就是创建一个公共类,然后用调用它的任何类的上下文初始化它。我在这个链接上找到了这一点。这实际上让我可以访问系统服务之类的东西。然后,我继续定义了一些类变量,让我可以在类内外调用这些变量。但为了实际处理变量的存储,我使用了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);
    }
}

或者这个。。。

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

相关内容

  • 没有找到相关文章

最新更新