Возникли проблемы с глобальной переменной в приложении Android - PullRequest
0 голосов
/ 28 апреля 2011

Эй, у меня проблемы с объявлением, изменением и использованием глобальной переменной.Я пробовал весь процесс «создать класс, который расширяет ваше приложение и помещает туда переменные», но я не уверен, как его реализовать.Вот мой класс с переменной в нем.

    public class MyApp extends Application {

    public int listPos;

}

Затем я попытался получить доступ и изменить int listPos здесь.

public class Browse extends ListActivity{
MyApp app = ((MyApp)getApplicationContext());

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  String[] coffeeTypes = getResources().getStringArray(R.array.coffeeTypes);
  setListAdapter(new ArrayAdapter<String>(this, R.layout.listview, coffeeTypes));

  ListView lv = getListView();
  lv.setTextFilterEnabled(true);

  lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {
        app.listPos = position;
        startActivity(new Intent(Browse.this, CoffeeTypes.class));

    }
  });
}

}

Затем я попыталсяобратитесь к переменной в следующем упражнении, чтобы определить результат оператора if else

public class CoffeeTypes extends Activity{
MyApp app = ((MyApp)getApplicationContext());

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  if(app.listPos == 0){
      Toast.makeText(this, "WEEEEEEE!0", Toast.LENGTH_LONG).show();
  }
  else if(app.listPos == 1){
      Toast.makeText(this, "RAWR!1", Toast.LENGTH_LONG).show();

Кто-нибудь знает, что я делаю неправильно?

Ответы [ 4 ]

0 голосов
/ 28 апреля 2011

Я делаю классы переменных приложения, делая переменные закрытыми, а затем создаю публичные методы get () и set () для изменения переменных. Вы можете попробовать это, но кажется, что вы делаете все правильно, технически

одна из причин, почему это может пойти не так, заключается в том, что вы реализуете материал в onCreate, а не в onStartCommand. если вы тестируете эту функцию с неверными предположениями / знанием цикла «Активность», она может пойти не так

0 голосов
/ 28 апреля 2011

Создайте класс, подобный этому

class globalClass
{
       static int lastPos;
}

Вы можете установить значения, используя

globalClass.lastPos = value;

и получить функцию

int myVal = globalClass.lastPos;
0 голосов
/ 28 апреля 2011

Вы можете использовать ответ соори с некоторыми модификациями. Лично я бы все еще использовал ваш класс myApp, но изменил бы listPos на static и получил бы к нему доступ таким образом. Делая это таким образом, вы можете использовать метод класса приложения onCreate для инициализации значений при необходимости (хотя в этом примере это не понадобится) или другие методы Android.

public class MyApp extends Application {

    public static int listPos;

}

//~~ Elsewhere:
MyApp.listPos = 5; //etc

Но это не лучший способ справиться с вашим типом проблемы.

Вы должны передавать информацию о позиции списка (или идентификатор элемента, по которому щелкнули, или как вы обрабатываете свои данные) через Intent.

Вместо того, чтобы иметь глобальную переменную для отслеживания этой информации, оставьте ее локальной только для Intent:

public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {
        //app.listPos = position;
        Intent intent = new Intent(Browse.this, CoffeeTypes.class);
        intent.putExtra("position", position);
        startActivity(intent);
        //startActivity(new Intent(Browse.this, CoffeeTypes.class));

    }

Это передает данные о положении в новое действие через намерение. В своей деятельности CoffeeTypes вы должны начать с чего-то следующего:

//in onCreate...
int incomingPosition = getIntent().getIntExtra("position",-1));
if(incomingPosition != -1) { //do stuff }

Это будет считывать данные "позиции" из входящего Намерения, чтобы вы могли использовать их. Значение -1 выше является значением по умолчанию, если ничего не добавлено.

Одно последнее предупреждение: вы можете быть осторожны при отправке позиции списка назад и вперед, в зависимости от того, как настроено ваше приложение, если новые элементы добавляются / удаляются элементы, позиция списка может больше не относиться к элементу, который вы думали это сделал. Если эти типы кофе / что бы вы ни использовали, имеют отдельный уникальный идентификатор, который может быть более подходящим для избежания вышеуказанной ситуации, рассмотрите возможность использования этого вместо этого.

0 голосов
/ 28 апреля 2011

Я не уверен, если это проблема видимости с ОС Android, вы можете сделать публичные функции, которые могут выступать в качестве получателей для переменной?

int getListPos(){ return this.listpos; }

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

Возможно, временным обходным путем, заставляющим вас двигаться, может быть создание статического класса доступных переменных?

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