Использование глобальных переменных - PullRequest
1 голос
/ 26 июня 2011

Я знаю, что этот вопрос задавался миллион раз, потому что я провел некоторое исследование и нашел много тем по этому вопросу.Я пытался использовать ответы в этих темах, но у меня возникли некоторые проблемы.

Я ищу, чтобы установить несколько переменных, которые я могу использовать во всех моих действиях.

Iсоздал класс 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 мне нужно получить это значение.

Ответы [ 5 ]

2 голосов
/ 26 июня 2011

Создайте вспомогательный класс следующим образом ...

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();
    }
}
0 голосов
/ 13 мая 2013

То, что я настроил, и это работает для меня, - это просто создать открытый класс, а затем инициализировать его с контекстом из того класса, который его назвал. Я нашел это на этой ссылке. Это фактически позволило мне получить доступ к таким вещам, как системные службы. Затем я определил некоторые переменные класса, которые позволяют мне входить и выходить из класса. Но чтобы на самом деле обрабатывать хранение переменных, я использовал SharedPrefferences. Приятной особенностью этой настройки было то, что мне не нужно было настраивать код для общих настроек, прежде чем я получил доступ к каждой переменной. Я просто сделал это через открытый класс. Теперь имейте в виду, я полный новичок в этом деле, и я не уверен, что это лучший подход, или даже если это вообще нужно делать таким образом. Но я решил поделиться тем, что я делал, все же. Итак, вот код:

    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
0 голосов
/ 26 июня 2011

Что делать, если вы делаете

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

Из документов не ясно, вы получаете реальный объект приложения из getApplicationContext() или какой-либо другой реализации. И из кода это точно не выглядит так.

Для ваших целей, однако, вы хотите получить объект Application, который будет вашим GlobalVariables. И убедитесь, что он правильно зарегистрирован в манифесте.


Также просто чтобы убедиться, что у вас есть

package com.my.application;

В начале GlobalVariables не так ли? Не вижу этого в своем фрагменте.

0 голосов
/ 26 июня 2011

обо всем по порядку ...

Вам следует тщательно подумать, нужна ли вам глобальная переменная и почему. Глобальные переменные должны использоваться только в качестве крайней меры. Более того, если вам в конечном итоге понадобится использовать глобальные переменные, вам нужно документировать их до смерти, потому что не делайте ошибки, если ваше приложение становится сложным, вы потеряете одну или несколько из них. Выследить их - серьезная ПИА !!!

По моему опыту, почти 99% глобальных переменных используются из-за лени программистов, и все, чего они пытались достичь, могло быть сделано таким образом, чтобы использовать лучшие практики программирования.

Вот пример: https://groups.google.com/forum/#!topic/android-developers/yfI89IElhs8

Не зная больше о том, что вы пытаетесь передать между вашими классами, я не могу предложить никакого другого совета, кроме того, что я давал. Тем не менее, я ПОЗИТИВНО, что вы можете достичь того, что ищете, не используя глобальные переменные.

0 голосов
/ 26 июня 2011

Вам необходимо импортировать GlobalVariables. Также вам нужно поместить полное имя класса GlobalVariables в атрибут имени приложения в манифесте, как описано здесь: http://developer.android.com/guide/topics/manifest/application-element.html#nm

...