#java #android #android-fragments
#java #Android #android-фрагменты
Вопрос:
Я использую фрагмент, который показывает различную информацию об объекте. Внутри onCreate фрагмента я извлекаю некоторые значения из объекта и сохраняю их в глобальных переменных:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
String serializedShow = getArguments().getString(SHOW_TO_LOAD);
mShow = (new Gson()).fromJson(serializedShow, Show.class);
mScope = mShow.getScope();
mLanguage = MainActivity.getSystemLanguage();
mLanguage = mLanguage.replace("_", "-");
mId = Integer.valueOf(mShow.getShowId()).toString(); //this line is important
Log.v(LOG_TAG, "DetailFragment onStart, Id is " mId);
}
Как вы можете видеть, я присваиваю этой переменной определенный идентификатор. Я использую журнал, чтобы проверить, является ли значение mId правильным, и это так. Пока все работает хорошо.
Следующий ввод кода пользователь может нажать кнопку, чтобы открыть URL-адрес в браузере. URL-адреса отличаются при каждом создании этого фрагмента (каждый раз, когда этот фрагмент показывает разные вещи)
private void fetchIMDBId(){
Log.v(LOG_TAG, "starting IMDBAsyncTask with id " mId);
new Async4().execute(mId);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_launch:
fetchIMDBId();
return true;
default:
break;
}
return false;
}
Как вы можете видеть, вызывается метод fetchIMDBId() . У меня есть строка журнала, чтобы проверить, совпадает ли значение mId, которое было установлено ранее в onCreate .
Это не то же самое, это совершенно другое значение.
В частности, это идентификатор объекта, который отображался в предыдущем экземпляре, если этот фрагмент.
Пожалуйста, скажите мне, что я делаю не так. Спасибо.
E: объявление переменной
public class DetailFragment extends Fragment {
private static final String LOG_TAG = DetailFragment.class.getSimpleName();
...
private String mScope, mLanguage, mId;
...
@Override
public void onCreate(Bundle savedInstanceState) {
...
}
E: полный исходный код здесь
Комментарии:
1. Является ли переменная среднего класса или переменная экземпляра?
2. Что вы имеете в виду? Я добавил объявление в основной пост
3. Есть ли какие-либо сеттеры в mId? Вы уверены, что два журнала, которые вы проверяете, относятся к одному и тому же экземпляру вашего класса?
4. Переданный объект действителен. Среднее значение, возвращаемое журналом в oncreate, является правильным, и, кроме того, там средняя переменная больше не затрагивается. Я добавил полный источник для ясности.
Ответ №1:
Я полагаю, что вы неправильно назначаете свой mId для асинхронной задачи. Вы должны применить mid к методу асинхронной задачи, чтобы вызывался соответствующий mId из каждого фрагмента
private void fetchIMDBId(String mId){
Log.v(LOG_TAG, "starting IMDBAsyncTask with id " mId);
new Async4().execute(mId);
}
а затем вызовите метод внутри фрагмента
fetchIMDBId(this.mId);
Комментарии:
1. По-прежнему не работает. В журнале запуска отображается правильное значение, но в журнале в fetchIMDBId отображается другое значение.
2. Вы пытались установить для переменной mId значение static?
3. ЭТО РАБОТАЕТ, я обязан тебе своей жизнью, спасибо.
4. Я рад, что это помогло вам 🙂 счастливого кодирования
Ответ №2:
Попробуйте использовать this.mId
, а также проверьте, совпадает ли ваш объект fragment с предыдущим.
this.fetchIMDBId()
Вместо этого вызовите.