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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.74
Yevgenius
0 / 0 / 0
Регистрация: 25.12.2013
Сообщений: 42
#1

FindViewByID возвращает Null - Программирование Android

23.03.2014, 17:57. Просмотров 3074. Ответов 7
Метки нет (Все метки)

День добрый.
Я в разработке андроида новичек, и застрял можно сказать в самом начале.
Имеется проект типа hello world
Один единственный activity с одной единственной кнопкой.
Пытаюсь добавить этой кнопке onTouchListener
Для этого надо бы привязаться к кнопке по ID

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MainActivity extends ActionBarActivity {
    Button Button_1;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        if (savedInstanceState == null) 
        {
            getSupportFragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment()).commit();
        }
        
        Button_1 = (Button)findViewById(R.id.button1);
        Button_1.setText("My Text");
    }
}
При запуске программы - вылет.
Пошаговым дебагом выяснил, что Button_1 = (Button)findViewById(R.id.button1); возвращает null
Вроде во всех примерах hello world описывают нахождения контрола именно так.

Есть предположение что когда программа находится в onCreate, кнопка еще не создана. Отсюда и null
Но тогда вопрос, на каком этапе к ней подключаться?

Еще одно размышление в слух:
В проекте по умолчанию также создан класс
Java
1
public static class PlaceholderFragment extends Fragment
Может надо цеплять кнопку в нем? но он static и подцепить там кнопку не получилось.

В общем буду рад если подскажете что нибудь дельное.
А то обидно даже. Вроде ничего особенного, всего-то подключиться к кнопке, и вот не получается. Убил на это целый день.
В сети тоже искал все что с этим связанно. Обычно описывают случаи, когда просто кто то забывает
Java
1
setContentView(R.layout.activity_main);
или же подключен к активити в котором этой кнопки нет..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2014, 17:57     FindViewByID возвращает Null
Посмотрите здесь:

FindViewByID возвращает Null производного класса View - Программирование Android
Возвращает null в v, что может быть. если использовать родной SurfaceView все ОК. Кнопку находит. В проекте одно activity public...

RelativeLayout findViewById return null - Программирование Android
Я что-то не пойму никак.. почему RelativeLayout возвращает не ссылку на TextView, а null? @Override public Dialog...

Геокодирование. getFromLocationName() возвращает null - Программирование Android
По адресу (город, улица, дом) пытаюсь получить координаты. С некоторых пор почти всегда getFromLocationName() возвращает null. Хотя ранее...

BitmapFactory.decodeFile всегда возвращает null - Программирование Android
Выбираю картинку с галереи, получаю полный путь к файлу, но BitmapFactory.decodeFile(filename) всегда возвращает null. Почему?

LruCache метод put возвращает null - Программирование Android
Всем привет! Не могу поянть почему LruCache метод put возвращает null. Может быть кто знает подскажет в чем тут дело? Вот код: public...

FindViewById - Программирование Android
Назрел вопрос, почему в MainActivity мы пишем, например, ListView lvMain = (ListView) findViewById(R.id.lvMain); А в другом классе можно...

findViewById и Fragment - Программирование Android
Пытаюсь использовать getView().findViewById Но не работает

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
1566 / 1308 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
23.03.2014, 18:41     FindViewByID возвращает Null #2
Yevgenius,

Java
1
2
3
4
if (savedInstanceState == null) 
        {
            getSupportFragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment()).commit();
        }
видимо фрагмент переключается и на экране уже нет Вашей кнопки. Попробуйте без этого участка кода
Yevgenius
0 / 0 / 0
Регистрация: 25.12.2013
Сообщений: 42
23.03.2014, 19:04  [ТС]     FindViewByID возвращает Null #3
YuraAAA, Не помогает..
Мало того, комп перестал распознавать что телефон подключен через USB.
Самому телефону рестарт делал и Developer Mode включал/выключал.. Не работает. Но заряжается.
Наверно надо комп рестартовать. Может решит это дело. Сейчас рестартовать не могу т.к на работе.
Так что пока устраиваю дебаг через виртуальный девайс
YuraAAA
1566 / 1308 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
23.03.2014, 19:19     FindViewByID возвращает Null #4
activity_main.xml содержит в себе кнопку c ID'шником button1?
Yevgenius
0 / 0 / 0
Регистрация: 25.12.2013
Сообщений: 42
24.03.2014, 16:48  [ТС]     FindViewByID возвращает Null #5
YuraAAA, Да, содержит.
Проверял даже в R файле. все прописано. Ну в принципе и должно быть прописано, т.к это просто новый проект по базовому темплейту, плюс одна кнопка, которая добавлена через визуальный редактор. То-есть полный автомат. Нигде вручную ничего не менял.

Добавлено через 7 минут
YuraAAA, Так, вроде нашел где собака зарыта.
Сейчас перепроверил, в общем есть 2 xml-а.
1 - activity_main
2 - fragment_main
Потому и 2 класса.
Притом именно fragment_main.xml содержит в себе и базовый layout и кнопку в нем.
Но в MainActivity.java этот fragment_main представлен через класс
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public static class PlaceholderFragment extends Fragment {
 
        public PlaceholderFragment() {
        }
 
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container,
                    false);
            return rootView;
        }
    }
который сидит внутри класса MainAvtivity.

В общем в туториалах и уроках для чайников и hello world-ах такого построения я не видел. Наверное что-то изменилось в более поздних версиях.
Зачем этот PlaceholderFragment нужен и с чем его едят представляю чисто интуитивно, что он и содержит саму форму, обернутую в общий класс активитй. Но смысл?

Добавлено через 30 минут
Нет, все равно не работает.
Уже приписал все в этот PlaceholderFragment. При этом пришлось Button объявить как static (не знаю хорошо это или плохо)
Компиляция прошла. При запуске опять на том-же месте null и все тут..

Ну люди же как-то пишут hello world + кнопка
не может быть все так запутанно с самого начала?!

Может у кого есть пример кода, чтоб просто кнопка и подписка на ее onTouch? (на onClick подписаться получилось через xml без установки listener-а, а вот на остальные события видно listener-ы нужно вписывать через java)

Добавлено через 19 часов 28 минут
Наконец-то разобрался.
Если кому интересно, делюсь решением проблемы.
Итак, MainActivity Содержит в себе некий PlaceholderFragment, который имеет собственный XML, в котором и сидят все компоненты (кнопки, и т.д..)
Я создал переменную Button Button_1; в классе PlaceholderFragment, и затем в методе onCreateView смог найти его по ID и подключить к нему все что нужно было.

Еще, пришлось поставить минимальный API - 11. Иначе, предыдущие версии API не поддерживают класс Fragment

вот код:
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package com.leibman.helloworld;
 
import android.support.v7.app.ActionBarActivity;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.Button;
 
public class MainActivity extends ActionBarActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment()).commit();
        }
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
 
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
 
    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {
        Button Button_1;
        int Counter = 0;
        
        public PlaceholderFragment() {
        }
 
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container,
                    false);
            
            Button_1 = (Button)rootView.findViewById(R.id.button1);
            Button_1.setText("Hello World");
            Button_1.setOnTouchListener(On_Touch_Listener);
            
            return rootView;    
        }
        
        OnTouchListener On_Touch_Listener = new OnTouchListener() {
            
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (v.getId() == R.id.button1)
                {
                    Button_1.setText(String.valueOf(Counter));
                    Counter++;
                }
                return false;
            }
        };
    }
}
NiRamz
211 / 211 / 16
Регистрация: 26.12.2010
Сообщений: 691
24.03.2014, 19:31     FindViewByID возвращает Null #6
Цитата Сообщение от Yevgenius Посмотреть сообщение
Еще, пришлось поставить минимальный API - 11. Иначе, предыдущие версии API не поддерживают класс Fragment
используйте support библиотеки для поддержки нового апи в старых версиях.

findviewById из активити можно сделать нужного элемента, но только если он есть в xml разметке, которую мы делает setContentView (разметка фрагментов тоже будет доступна из активити, но только после того как он приаттачится к ней).

Цитата Сообщение от Yevgenius Посмотреть сообщение
При этом пришлось Button объявить как static (не знаю хорошо это или плохо)

очень плохо
Yevgenius
0 / 0 / 0
Регистрация: 25.12.2013
Сообщений: 42
24.03.2014, 19:34  [ТС]     FindViewByID возвращает Null #7
NiRamz,
То что плохо, что кнопка static - догадывался. Наверное ее потом нельзя будет менять. Но в конце концов получилось и без атрибута static.
А вот про библиотеки support надо будет почитать что это такое и с чем его едят.

Спасибо за комментарий
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2014, 19:45     FindViewByID возвращает Null
Еще ссылки по теме:

Какую роль выполняет findViewById в андроиде? - Программирование Android
ребята! подскажите пожалуйста, какую роль выполняет findViewById в андроиде? пример VideoView videoView =...

Новая реализация findViewById и ошибка "Unfortunately, MyApp has been stopped" - Программирование Android
Здравствуйте, хотел немного сократить код программы, создав метод, который принимает на вход View и Integer //Сам метод public ...

Проверка на null - Программирование Android
Как правильно создать условие. У меня есть строчки кода, которые в переменную apiTokenMy записывают значение String tokenMy1 =...

lockCanvas() возврашяет null - Программирование Android
Доброе время суток. У меня возникла проблема. Пишу 2д игру под андроид (так для себя не чего серьёзного) . За основу взят этот мануал...

Вставить null в SQLite - Программирование Android
Есть такой код @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE "+ DATABASE_TABLE+ " ("+ ...


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

Или воспользуйтесь поиском по форуму:
NiRamz
211 / 211 / 16
Регистрация: 26.12.2010
Сообщений: 691
24.03.2014, 19:45     FindViewByID возвращает Null #8
Цитата Сообщение от Yevgenius Посмотреть сообщение
Наверное ее потом нельзя будет менять
менять нельзя будет если еще дописать ей final. final static лучше использовать для констант, static же для методов, к примеру в разного рода хелперах
Yandex
Объявления
24.03.2014, 19:45     FindViewByID возвращает Null
Ответ Создать тему
Опции темы

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