Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
addgoo
0 / 0 / 0
Регистрация: 27.08.2016
Сообщений: 6
#1

Вызов функций из класса - Программирование Android

27.08.2016, 13:21. Просмотров 242. Ответов 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>
Почему получается Ошибка? и как обращаться к своим классам? (я разбиваю программу на свои классы, для упрощения разработки)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2016, 13:21
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вызов функций из класса (Программирование Android):

Вызов функций телефона
Можно ли как-то вызвать функцию телефона. Вот например в компьютере, есть...

Вызов класса
Добрый день? подскажите разрабатываю первое приложение под Android. Вопрос в...

Вызов функции из класса
как сменить цвет из одного класса в другом классе в главном классе:...

Вызов метода из другого класса
Не могу разобраться, почему вылетает приложение, когда пытаюсь задать текст для...

Вызов Context из другого класса
Как вызвать Context из класса Output public class MapsActivity extends...

Вызов метода из класса в таймере
Не могу получить титул веб страницы в таймере (ошибка). Пример: public...

12
vxg
Модератор
3231 / 2035 / 319
Регистрация: 13.01.2012
Сообщений: 7,887
27.08.2016, 13:28 #2
addgoo, вы ищите кнопку в классе у которого не просто такой кнопки в разметке нет - у него вообще разметки нет - вот оно и пишет null в переменную
0
addgoo
0 / 0 / 0
Регистрация: 27.08.2016
Сообщений: 6
27.08.2016, 13:29  [ТС] #3
Если не сложно, поясните как быть?
0
vxg
Модератор
3231 / 2035 / 319
Регистрация: 13.01.2012
Сообщений: 7,887
27.08.2016, 13:34 #4
Ищите её в том классе где она есть в разметке

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

В общем случае с кнопками и другими элементами активити должна иметь дело только сама активити. Ссылки на кнопки следует получать в OnCreate и хранить (если нужно) в полях активити.
0
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);
таже ошибка осталась.
0
vxg
Модератор
3231 / 2035 / 319
Регистрация: 13.01.2012
Сообщений: 7,887
27.08.2016, 14:45 #11
addgoo, покажите activity_main__society_
0
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>
0
vxg
Модератор
3231 / 2035 / 319
Регистрация: 13.01.2012
Сообщений: 7,887
27.08.2016, 16:16 #13
addgoo, идея такая - Вы хоть и унаследовались от активити но не делали OnCreate и что-то внутри вашего по определению кривого объекта не инициализировано вот и не находит
0
27.08.2016, 16:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2016, 16:16
Привет! Вот еще темы с решениями:

Вызов класса из класса
Здравствуйте есть класса Session_stud: public class Session_stud { public...

Создание класса и вызов его методов
Код: public class DIYliq extends AppCompatActivity implements...

Вызов нестатического метода из другого класса
Здравствуйте. Подскажите, как можно вызвать нестатистический метод из другого...

Вызов новой активити не из класса активити
Есть 4 класса: 1) WelcomeActivity; 2) MainActivity; 3) PopUpActivity; 4)...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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