Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
dwayne
0 / 0 / 0
Регистрация: 01.11.2013
Сообщений: 27
#1

View во фрагментах - Android

02.05.2016, 10:00. Просмотров 244. Ответов 11
Метки нет (Все метки)

Чтобы прикрепить вид к layout в onCreateView мы раздуваем вид таким образом:
Java
1
View view = inflater.inflate(R.layout.fragment_mylayout, parent, false);
и в конце метода возвращаем
Java
1
return view;
А если я хочу использовать view в другом методе этого же класса, в который по определенным причинам не могу передать ссылку на view, как мне поступить? Да, я могу view сделать полем класса, но есть ли родные способы для решения этой проблемы? Можно использовать getView(), но при быстрой загрузке фрагмента (быстро нажимаю на кнопку с этим фрагментом) view теряется и вылетает ошибка по null. Так, собственно, есть ли родные способы, кроме getView() и создания view как поля класса, позволяющие прикрепить view из другого метода?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Паблито
2013 / 1755 / 545
Регистрация: 12.05.2014
Сообщений: 6,208
Завершенные тесты: 1
02.05.2016, 10:48     View во фрагментах #2
Цитата Сообщение от dwayne Посмотреть сообщение
но при быстрой загрузке фрагмента (быстро нажимаю на кнопку с этим фрагментом) view теряется и вылетает ошибка по null.
код?
dwayne
0 / 0 / 0
Регистрация: 01.11.2013
Сообщений: 27
02.05.2016, 13:11  [ТС]     View во фрагментах #3
Цитата Сообщение от Паблито Посмотреть сообщение
код?
весь? Null выскакивает на строчке:
Java
1
TextView text = getView().findViewById(R.id.text);
Паблито
2013 / 1755 / 545
Регистрация: 12.05.2014
Сообщений: 6,208
Завершенные тесты: 1
02.05.2016, 13:12     View во фрагментах #4
ну да, весь, надо же понять что там написано и почему вылетает там, где не должно
dwayne
0 / 0 / 0
Регистрация: 01.11.2013
Сообщений: 27
02.05.2016, 13:23  [ТС]     View во фрагментах #5
Все стандартно.
Fragment:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        WeatherUpdater asyncTask = new WeatherUpdater();
        asyncTask.execute((String) url);
        asyncTask.delegate = this;
        return view = inflater.inflate(R.layout.fragment_main, container, false);
    }
 
public void publishFinish(String json) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
        WeatherData weatherData = gson.fromJson(json, WeatherData.class);
TextView text = (TextView) getView().text.setText("Температура: " + weatherData.main.temperature);
}
Activity:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private FragmentManager mFragmentManager;
private FragmentTransaction mFragmentTransaction;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
mFragmentManager = getFragmentManager();
        mFragmentTransaction = mFragmentManager.beginTransaction();
        mFragmentTransaction.replace(R.id.content, new OneFragment());
        mFragmentTransaction.commit();
    }
 
@Override
    public void onClick(View v) {
        int id = v.getId();
        mFragmentTransaction = mFragmentManager.beginTransaction();
        
        if (id == R.id.one) {
            mFragmentTransaction.replace(R.id.content, new OneFragment());
        } else if (id == R.id.two) {
            mFragmentTransaction.replace(R.id.content, new TwoFragment());
        } else if (id == R.id.three) {
            mFragmentTransaction.replace(R.id.content, new ThreeFragment());
        }
        mFragmentTransaction.commit();
    }
Разметка:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
 
<FrameLayout
            android:id="@+id/content"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="10"
            android:orientation="vertical" />
 <LinearLayout
            android:id="@+id/footer"
            android:layout_width="fill_parent"
            android:layout_height="60.0dip"
            android:gravity="center"
            android:orientation="horizontal">
 
            <ImageView
                android:id="@+id/one"
                android:layout_width="0.0dip"
                android:layout_height="fill_parent"
                android:layout_weight="1.0"
                android:focusable="true"
                android:scaleType="center"
                android:visibility="gone" />
 
            <ImageView
                android:id="@+id/two"
                android:layout_width="0.0dip"
                android:layout_height="fill_parent"
                android:layout_weight="1.0"
                android:background="?android:selectableItemBackground"
                android:focusable="true"
                android:scaleType="center"
                android:onClick="onClick" />
 
            <ImageView
                android:id="@+id/three"
                android:layout_width="0.0dip"
                android:layout_height="fill_parent"
                android:layout_weight="1.0"
                android:background="?android:selectableItemBackground"
                android:focusable="true"
                android:scaleType="center"
                android:onClick="onClick" />
 
        </LinearLayout>
    </LinearLayout>
Паблито
2013 / 1755 / 545
Регистрация: 12.05.2014
Сообщений: 6,208
Завершенные тесты: 1
02.05.2016, 13:26     View во фрагментах #6
publishFinish откуда-то вызывается?
dwayne
0 / 0 / 0
Регистрация: 01.11.2013
Сообщений: 27
02.05.2016, 13:29  [ТС]     View во фрагментах #7
Паблито, из WeatherUpdater. Там все просто:
Java
1
2
3
4
5
6
7
8
9
public AsyncResponse delegate = null;
    @Override
    public void onPostExecute(Void args) {
        delegate.processFinish(json);
    }
 
    public interface AsyncResponse {
        void processFinish(String output);
    }
Паблито
2013 / 1755 / 545
Регистрация: 12.05.2014
Сообщений: 6,208
Завершенные тесты: 1
02.05.2016, 13:33     View во фрагментах #8
Цитата Сообщение от dwayne Посмотреть сообщение
весь? Null выскакивает на строчке:
TextView text = getView().findViewById(R.id.text);
и где эта строчка?

Цитата Сообщение от dwayne Посмотреть сообщение
TextView text = (TextView) getView().text.setText("Температура: " + weatherData.main.temperature);
а это что за бред?

потому я и просил весь код, но так как надо все вытягивать силой, то я пожалуй пойду дальше мимо этой темы
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
02.05.2016, 16:08     View во фрагментах #9
dwayne,

Так попробуйте.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private TextView text;
 
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_main, container, false);
        WeatherUpdater asyncTask = new WeatherUpdater();
        asyncTask.execute((String) url);
        asyncTask.delegate = this;
        text = (TextView) view.findViewById(R.id....);
        return view;
    }
 
public void publishFinish(String json) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
        WeatherData weatherData = gson.fromJson(json, WeatherData.class);
         text.setText("Температура: " + weatherData.main.temperature);
}
Цитата Сообщение от dwayne Посмотреть сообщение
TextView text = (TextView) getView().text.setText("Температура: " + weatherData.main.temperature);
Это вообще ахинея какая-то
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
04.05.2016, 17:31     View во фрагментах #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от dwayne Посмотреть сообщение
Можно использовать getView()
Как раз сегодня с этим столкнулся.
http://stackoverflow.com/questions/6...d-in-fragment:
"Note: it's works only after onCreateView(). So, you can't use this in onCreate()".
Таким образом, у вас неправильно написан код, поскольку вы используете getView() при вызове из класса, который вызывается из onCreateView(). Логично, что он будет null. В этом случае можно, например, внутрь него передать этот самый view. Тогда не придётся использовать глобальные переменные, про которые написал YuraAAA.
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
04.05.2016, 20:13     View во фрагментах #11
CoolMind, передавать view внутрь asynctask - не хорошо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2016, 14:19     View во фрагментах
Еще ссылки по теме:

Движение View Android
Android NavigationView на фрагментах
Как добавить динамически в ToolBar виджет SearchView в нужных фрагментах Android
Android Сериализация View
Android Красивые View

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
06.05.2016, 14:19     View во фрагментах #12
YuraAAA, честно говоря, не знаю. Может быть, но это же можно отнести и к кнопкам, надписям и т.д. Или я неправильно понял.
Yandex
Объявления
06.05.2016, 14:19     View во фрагментах
Ответ Создать тему
Опции темы

Текущее время: 10:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru