Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/47: Рейтинг темы: голосов - 47, средняя оценка - 4.68
 Аватар для Yevgenius
0 / 0 / 0
Регистрация: 25.12.2013
Сообщений: 42

FindViewByID возвращает Null

23.03.2014, 17:57. Показов 9555. Ответов 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);
или же подключен к активити в котором этой кнопки нет..
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.03.2014, 17:57
Ответы с готовыми решениями:

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

FindViewById() возращает null
Добрый день! Воспроизвожу код из книги Head First Android. При получении элементов при помощи метода findViewById() метод возращает null...

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

7
 Аватар для YuraAAA
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
23.03.2014, 18:41
Yevgenius,

Java
1
2
3
4
if (savedInstanceState == null) 
        {
            getSupportFragmentManager().beginTransaction().add(R.id.container, new PlaceholderFragment()).commit();
        }
видимо фрагмент переключается и на экране уже нет Вашей кнопки. Попробуйте без этого участка кода
0
 Аватар для Yevgenius
0 / 0 / 0
Регистрация: 25.12.2013
Сообщений: 42
23.03.2014, 19:04  [ТС]
YuraAAA, Не помогает..
Мало того, комп перестал распознавать что телефон подключен через USB.
Самому телефону рестарт делал и Developer Mode включал/выключал.. Не работает. Но заряжается.
Наверно надо комп рестартовать. Может решит это дело. Сейчас рестартовать не могу т.к на работе.
Так что пока устраиваю дебаг через виртуальный девайс
0
 Аватар для YuraAAA
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
23.03.2014, 19:19
activity_main.xml содержит в себе кнопку c ID'шником button1?
0
 Аватар для Yevgenius
0 / 0 / 0
Регистрация: 25.12.2013
Сообщений: 42
24.03.2014, 16:48  [ТС]
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;
            }
        };
    }
}
0
216 / 216 / 33
Регистрация: 26.12.2010
Сообщений: 691
24.03.2014, 19:31
Цитата Сообщение от Yevgenius Посмотреть сообщение
Еще, пришлось поставить минимальный API - 11. Иначе, предыдущие версии API не поддерживают класс Fragment
используйте support библиотеки для поддержки нового апи в старых версиях.

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

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

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

Спасибо за комментарий
0
216 / 216 / 33
Регистрация: 26.12.2010
Сообщений: 691
24.03.2014, 19:45
Цитата Сообщение от Yevgenius Посмотреть сообщение
Наверное ее потом нельзя будет менять
менять нельзя будет если еще дописать ей final. final static лучше использовать для констант, static же для методов, к примеру в разного рода хелперах
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.03.2014, 19:45
Помогаю со студенческими работами здесь

OnPostExecute возвращает null
doInBackground возвращает ответ с сервера. А вот onPostExecute этого ответа не получает и возвращает null. import...

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

Тестирование, Активити возвращает null
@RunWith(AndroidJUnit4.class) @LargeTest public class CategoryEditorTest { String space = " "; @Rule public...

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru