2013-10-25 2 views
0

Я пытаюсь объявить глобальную переменную, но безуспешно. Я следил за this tutorial, но это не работает, если я хочу перенести переменную из фрагмента в MainActivity.Android Объявить фрагмент глобальной переменной

Сначала я добавил этот код в мой класс фрагмент:

public class WebViewFragment extends Fragment{ 
private WebView myState; 

public WebView getState(){ 
    return myState; 
    } 
    public void setState(){ 
    myState = webView; 
    } 

} 

А потом я добавил это к моему MainActivity, но он не работает:

WebViewFragment appState = ((WebViewFragment)getApplicationContext()); 
WebView state = appState.getState(); 

Я получаю error: Cannot cast from Context to WebViewFragment

ответ

2

Ну, вы пытаетесь применить контекст приложения к фрагменту, который не может работать. Вам нужно будет найти правильный фрагмент с чем-то вроде getFragmentManager().findFragmentById(R.id.my_fragment) и бросить его.

В учебнике он использует объект приложения, а не фрагмент. Это плохая идея, и ее следует избегать, если это возможно, поскольку все переменные, находящиеся внутри объекта приложения, не будут собирать мусор, заполняя ОЗУ.

0

Все, что вам нужно сделать, это:

Поместите это в вас классе Application:

WebView state; 
public WebView getState(){ 
    return myState; 
} 
public void setState(WebView webViewState){ 
    myState = webViewState; 
} 

Тогда в вашем фрагменте просто это, чтобы установить состояние:

getActivity().getApplicationContext().setSate(state); 

И это в деятельности для получения состояния:

getApplicationContext().getSate(); 

Вышеприведенный код должен быть разделен так, чтобы вы могли проверить, нет ли значения null.

+0

Я не совсем понимаю, куда положить код. Первая часть кода, которую вы сказали, мне нужно добавить в класс Application, о котором вы говорите? Мой класс MainActivity или мой класс фрагментов? – Izak

+0

Ни один из них, как и в учебнике, который вы опубликовали, должен использовать класс, являющийся подклассом Приложения, и поместите его туда. – Mikel

+0

Вы должны прочитать этот ответ http://stackoverflow.com/a/708317/562840 – Mikel

0

У меня была аналогичная проблема, и, прочитав некоторые комментарии, я смог предоставить решение для одного случая. У меня был собственный класс адаптеров, который я создавал, и мне нужно было изменить глобальную переменную из этого класса адаптера. Моя глобальная переменная была частью фрагмента, который был привязан к Activity. Вот что я сделал:

В фрагменте я установить глобальную переменную:

public String myGlobalString = "initial_value";

В классе адаптера, который я строил, в функции GetView (...) Я имел:

MyFragment myFragment = (MyFragment) ((MyActivity) context).getFragmentManager().findFragmentById(R.id.fragment_my_fragment); 
myFragment.myGlobalString = "new_value"; 

Это сработало для меня. Я пытался изменить значение из EditText в ListView, и поэтому в моем адаптере ListView я добавил addTextChangedListener и поместил свой код в функцию onTextChanged.

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