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

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

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

Вызов функций из класса - Android

27.08.2016, 13:21. Просмотров 201. Ответов 12

Добрый день, позавчера стал изучать программирование для андроид и столкнулся с не понятной для меня вещью, и хочу сразу разобраться, что тут не так.
Учусь программировать на AndroidStudio.

Создаю тестовую Activity в которой просто находится кнопка Button . План такой, при её нажатии должна вызваться функция create_menu , из другого Класса, не относящегося к данной Activity (находящиеся в отдельном файле).
Так вот, в другом классе, пытаются получить идентификаторы кнопок, и при данной попытке, происходит краш. Null pointer. А в дебаг сообщених, выводится
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.olololo.first/com.olololo.first.Main_First_Activity}: java.lang.NullPointerException
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
////////////////////////////////////////// начало файла Activity
    public static Main_menu menu;  // статическая константа для сформированного меню
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main__first_);
 
        /* создание меню */
        if(create_menu() == false)  return;
        
    }
 
 
    boolean create_menu()
    {
      /* выделяем память для меню */
      menu = new Main_menu();
 
      /* инициализация меню */
      if(menu.init() == false) return false;  // в метод инит код попадает, но далее при вызове findViweById происходит исключение
 
        return true;
    }
///////////////////////////////////////////////////// Конец файла Activity
 
///////////////////////////////////////////////////// Начало файла Main_Menu.java
package Ololo_first;
 
 
public class Main_menu extends AppCompatActivity  implements View.OnClickListener {
 
  public Button start_button;
 
  public boolean init()
  {
    start_button = (Button) findViewById(R.id.button_id); // <------------------------------------------------------- тут происходит краш!!!!! (хотя если это действие делать в активити, то краша нет)
    return false;
  }
}
Manifest
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.olololo.first">
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".Main_Activity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            
        </activity>
    </application>
 
</manifest>
Почему получается Ошибка? и как обращаться к своим классам? (я разбиваю программу на свои классы, для упрощения разработки)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3061 / 1863 / 196
Регистрация: 13.01.2012
Сообщений: 7,083
27.08.2016, 13:28     Вызов функций из класса #2
addgoo, вы ищите кнопку в классе у которого не просто такой кнопки в разметке нет - у него вообще разметки нет - вот оно и пишет null в переменную
addgoo
0 / 0 / 0
Регистрация: 27.08.2016
Сообщений: 6
27.08.2016, 13:29  [ТС]     Вызов функций из класса #3
Если не сложно, поясните как быть?
vxg
Модератор
3061 / 1863 / 196
Регистрация: 13.01.2012
Сообщений: 7,083
27.08.2016, 13:34     Вызов функций из класса #4
Ищите её в том классе где она есть в разметке

Добавлено через 1 минуту
+зачем ваше меню наследует от непоймичего? В этом есть смысл? Либо передайте туда готовую ссылку на кнопку либо контекст активити что бы класс искал в нем
addgoo
0 / 0 / 0
Регистрация: 27.08.2016
Сообщений: 6
27.08.2016, 13:35  [ТС]     Вызов функций из класса #5
Sorry за нелепый вопрос, но всёже спрошу.
А как сделать разметку для класса Main_Menu ? чтоб вышеуказанные действия можно было производить в данном классе, и результат передавать в активити?
vxg
Модератор
3061 / 1863 / 196
Регистрация: 13.01.2012
Сообщений: 7,083
27.08.2016, 13:37     Вызов функций из класса #6
addgoo, вы пытаетесь надеть штаны через голову и мне не ясно зачем вам это. Смысл доп класса?
addgoo
0 / 0 / 0
Регистрация: 27.08.2016
Сообщений: 6
27.08.2016, 13:38  [ТС]     Вызов функций из класса #7
Смысл в том, чтоб научиться. На тот случай если будет кода много. И нужно будет разбивать программу на логические части. Чтоб в дальнейшем таких проблем не было, как с пониманием..зачем нужна разметка для класса. ( кстати, так как её задать то? чтоб требуемое можно было сделать )
vxg
Модератор
3061 / 1863 / 196
Регистрация: 13.01.2012
Сообщений: 7,083
27.08.2016, 13:46     Вызов функций из класса #8
addgoo, выносить код имеет смысл если вы будете его использовать более чем один раз - это разве ваш случай? Разметка назначается через setContentView
Lumber
96 / 96 / 37
Регистрация: 02.12.2015
Сообщений: 236
27.08.2016, 13:51     Вызов функций из класса #9
Почему ошибка: второй класс унаследован от AppCompatActivity т.е. это как бы Activity, (но фактически таковой не является), он ищет R.id.button_id внутри себя - и конечно не находит.

В общем случае с кнопками и другими элементами активити должна иметь дело только сама активити. Ссылки на кнопки следует получать в OnCreate и хранить (если нужно) в полях активити.
addgoo
0 / 0 / 0
Регистрация: 27.08.2016
Сообщений: 6
27.08.2016, 14:04  [ТС]     Вызов функций из класса #10
Насчёт активити, вроде уяснил (постараюсь делать, работу только внутри определённого активити)

Сейчас попробовал в классе меню, сделать
Java
1
2
setContentView(R.layout.activity_main__society_);
перед findViewById(R.id.button_id);
таже ошибка осталась.
vxg
Модератор
3061 / 1863 / 196
Регистрация: 13.01.2012
Сообщений: 7,083
27.08.2016, 14:45     Вызов функций из класса #11
addgoo, покажите activity_main__society_
addgoo
0 / 0 / 0
Регистрация: 27.08.2016
Сообщений: 6
27.08.2016, 14:53  [ТС]     Вызов функций из класса #12
XML
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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.olololo.ferst.Main_Activity">
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button_id"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginBottom="120dp" />
</RelativeLayout>
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2016, 16:16     Вызов функций из класса
Еще ссылки по теме:

Вызов Fragment Android
Создание класса и вызов его методов Android
Android Вызов класса
Button вызов Android
Android Вызов активити

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

Или воспользуйтесь поиском по форуму:
vxg
Модератор
3061 / 1863 / 196
Регистрация: 13.01.2012
Сообщений: 7,083
27.08.2016, 16:16     Вызов функций из класса #13
addgoo, идея такая - Вы хоть и унаследовались от активити но не делали OnCreate и что-то внутри вашего по определению кривого объекта не инициализировано вот и не находит
Yandex
Объявления
27.08.2016, 16:16     Вызов функций из класса
Ответ Создать тему
Опции темы

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