2016-03-07 2 views
1

РЕДАКТИРОВАТЬ:Получить ссылку на объект из другого активности

Это метод я использую для initialize переменных после компоновки activity загружается в методе onCreate()

private void initializeVariables() { 
    randomButton = (Button) findViewById(R.id.randomButton); 
    gameButton = (Button) findViewById(R.id.gameButton); 
    i = 1; 
    listIndex = 0; 
    nameList = PlayersNames.nameList; 
    villagerBundle = new ArrayList<>(); 
    characters = new ArrayList<Card>(); 
    players = new ArrayList<Player>(); 


    villagerOne = new Villager(); 
    villagerTwo = new Villager(); 
    villagerThree = new Villager(); 
    villagerFour = new Villager(); 
    villagerFive = new Villager(); 

    villagerBundle.add(villagerOne); 
    villagerBundle.add(villagerTwo); 
    villagerBundle.add(villagerThree); 
    villagerBundle.add(villagerFour); 
    villagerBundle.add(villagerFive); 
} 

оригинальный вопрос:

У меня есть 2 мероприятия в Android.

В одном я творю:

public static Villager villagerOne; 

villagerOne = new Villager(); 

Тогда в другой один я должен получить доступ к villagerOne «s mAlive переменной:

villagerOne.getMAlive(); 

Для справки, это является Card класс:

public class Card { 

//Names 
public String mCharacter; 

//Status 
private boolean mAlive; 
private boolean mDefended; 
private boolean mOwled; 
private boolean mLastSavaged; 
private boolean mLastLynched; 


//Constructor 
public Card(){ 
} 

public void setMCharacter(String value){ 
    this.mCharacter = value; 
} 

public void setMAlive(boolean alive){ 
    this.mAlive = alive; 
} 

public String getMCharacter(){ 
    return mCharacter; 
} 

public boolean getMAlive(){ 
    return mAlive; 
} 

} 

И это Villager класс, который extends Card:

public class Villager extends Card { 

public Villager(){ 
    mCharacter = "Villager"; 
} 


} 
+1

Доступ к другой деятельности переменные напрямую - это плохая практика, а также усложняет всю жизнь. Поэтому попробуйте передать «mAlive» логическим путем. –

+0

Если вы намерены передать объект «Villager» из одного действия в другой, вы должны использовать «Intent», а ваши объекты «Card» должны реализовывать интерфейс «Parcelable». Вот хороший пример: https://stackoverflow.com/questions/7181526/how-can-i-make-my-custom-objects-be-parcelable – victorantunes

+0

Спасибо, я обновлю свой код, когда я закончу с приложением, спасибо за подсказку! – FET

ответ

0

Поскольку вы объявили ваш сельчанин, как статические активности один вы должны быть в состоянии получить к нему доступ из любой точки мира по

one.villagerOne.getMAlive() 

(здесь я предполагаю, что название класса деятельности 1: )

Поскольку это решение, кажется спорным, я вам скажу, почему я думаю, что это хороший один:

Если передать копию Villager через намерение и ваш селянин получает «убит», оригинальный Селянин будет быть уничтожены, почему копии все еще будут живы. это означает, что вы должны общаться с каждым видом деятельности с копией и сообщать им об утрате своей копии жителя деревни. Слушатели и все.

Если вы используете ссылку на статический член, как я предложил, все, что вам нужно сделать, это проверить ссылку на null перед вызовом любого метода:

if(one.villagerOne != null) alive = one.villageOne.getMAlive(); 
+2

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

+0

@GabeSechan Исходный код Android страдает от доступа к статическим членам классов. вы должны посмотреть на это. Если он достаточно хорош для кодировщиков Android, он достаточно хорош для всех – ilomambo

+0

Его не статические члены, которые обязательно являются злыми. Но статичные члены деятельности определенно. И я прочитал много исходного кода для Android, кроме статических констант, там действительно мало. Это плохая идея, и это будет автоматический отказ от любого компетентного эксперта по коду. –

0

Если вам нужна копия этой переменной , вы должны передать его через дополнительные услуги. Если вам нужно получить доступ к этой фактической переменной, вы, вероятно, должны зайти в систему. Данные, которые необходимы для нескольких видов деятельности, не должны принадлежать какой-либо Деятельности, она должна принадлежать другой структуре данных, которую могут достичь обе виды деятельности. Например, объект singleton Player, который может быть запрошен для его списка карт.

0

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

Intent i = new Intent(FirstActivity.this, SecondActivity.class); 
Villager villagerOne; 
villagerOne = new Villager(); 
i.putExtra("Villager", strName); 
startActivity(i); 

А на втором занятии вы получите результаты:

Villager villager = (Villager) getIntent.getSerializableExtra("Villager"); 
+1

Хотя здесь не будет иметь большого значения, внедрение «Parcelable» в целом намного лучше на Android, чем Serializable. – DeeV

+0

Вы правы, но у меня больше опыта с использованием Serializable, чем с Parcelable, поэтому я использую Serializable –

Смежные вопросы