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

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

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

Null при вызове метода из другого класса - Программирование Android

29.09.2016, 14:09. Просмотров 214. Ответов 6
Метки нет (Все метки)

Суть такая. Я создал приложение с двумя активити NavigationView (через стандартный конструктор Adroid Studio). В шапку NavView я вывожу информацию об устройстве (есть два метода которые выводят инфу к текствью в шапке). Мне нужно сделать так, чтобы при переходе на другие активити информация в шапке обновлялась из метода первого вью. Но выкидывается исключение NullPointer. В чем может быть проблема? Я только начинаю осваивать программирование, поэтому могу не понимать некоторых основ.

Кусок кода главного активити:
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
public class Main extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener, SensorEventListener{
 
 
    TextView drawerItemModel;
    TextView textBatteryTemperature;
    TextView textBatteryInfo;
    TextView tvHeaderModel;
    TextView tvHeaderOnline;
    TextView tvHeaderPO;
 
    static TextView textBtrInfo;
    static TextView textChrgInfo;
 
    SensorManager mSensorManager;
    Sensor mProximity;
    Timer mTimer;
 
 
    @RequiresApi(api = Build.VERSION_CODES.KITKAT_WATCH)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
 
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
 
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();
 
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
        View navHeaderMain = navigationView.inflateHeaderView(R.layout.nav_header_main); //программно подключаю шапку NavView
        drawerItemModel = (TextView) navHeaderMain.findViewById(R.id.drawerHdrItemModel); //сюда буду выводить инфу
        tvHeaderModel = (TextView) navHeaderMain.findViewById(R.id.tvHeaderModel);  //сюда буду выводить инфу
        tvHeaderPO = (TextView) navHeaderMain.findViewById(R.id.tvHeaderPO);  //сюда буду выводить инфу
        tvHeaderOnline = (TextView) navHeaderMain.findViewById(R.id.tvHeaderOnline);  //сюда буду выводить инфу
        navigationView.setNavigationItemSelectedListener(this);
    /*Конец родного кода*/
 
         /*Начало моего кода*/
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);// Получаем менеджер сенсоров
        mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);// Получаем датчик приближения
        textBtrInfo = (TextView) findViewById(R.id.textBtrInfo);
        textChrgInfo = (TextView) findViewById(R.id.textChrgInfo);
        textBatteryInfo = (TextView) findViewById(R.id.textBatteryInfo);
        textBatteryTemperature = (TextView) findViewById(R.id.textBatteryTemperature);
        textBatteryInfo.setText("Заряд батареи");
        textBatteryTemperature.setText("Температура батареи");
 
        //Выводим список датчиков
        LinearLayout linLayout = (LinearLayout) findViewById(R.id.linLayout);
        LayoutInflater ltInflater = getLayoutInflater();
 
        List<Sensor> sensList = mSensorManager.getSensorList(Sensor.TYPE_ALL);
        for (int i = 0; i < sensList.size(); i++) {
            View item = ltInflater.inflate(R.layout.sens_item, linLayout, false); //Создаем вью
            TextView tvName = (TextView) item.findViewById(R.id.tvName);    //Находим ТекстВью для имени датчика
            tvName.setText(String.valueOf(sensList.get(i).getName()));  //Оригинальное название датчика
            TextView tvPosition = (TextView) item.findViewById(R.id.tvPosition);    //Находим ТекстВью для номера сенсора
            tvPosition.setText(i+1 + ": ");  //Выводим номер сенсора
            TextView tvSalary = (TextView) item.findViewById(R.id.tvSalary);    //Находим ТекстВью для русского имени
            tvSalary.setText(checkMap(String.valueOf(sensList.get(i).getStringType()))); //Описание на русском
            TextView tvOrigName = (TextView) item.findViewById(R.id.tvOrigName);    //Находим ТекстВью для оригинального имени
            tvOrigName.setText(String.valueOf(sensList.get(i).getStringType()));   //Оригинальное имя
 
            item.getLayoutParams().width = LinearLayout.LayoutParams.MATCH_PARENT;
            linLayout.addView(item);
        }
 
        /*Конец моего кода*/
 
 
   protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(this,mProximity,SensorManager.SENSOR_DELAY_NORMAL);// Регистрируем слушатель
        textChrgInfo.setText(getBatteryLevel(this));
        textBtrInfo.setText(getBatteryTemperatute(this));
        drawHeaderUpdate();
    }
 
 
 
    public void drawHeaderUpdate(){
        mTimer = new Timer();
        mTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        onlineStatus();
                    }
                });
            }
        },0,1000);
 
        drawerItemModel.setText(Build.MANUFACTURER.toUpperCase().toString()); //вывожу инфу в шапку, здесь выкидывается исключение
        tvHeaderModel.setText(Build.MODEL.toUpperCase().toString()); //вывожу инфу в шапку, здесь выкидывается исключение
        tvHeaderPO.setText(Build.VERSION.RELEASE.toUpperCase().toString()); //вывожу инфу в шапку, здесь выкидывается исключение
 
    }
 
    /*Метод статуса онлайн*/
    public void onlineStatus(){
        tvHeaderOnline.setText(isOnline(this) ? " Online" : " Offline ");
    }
 
    }
B код второго активити:
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
public class SensDiag extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {
 
    Main main;
    TextView drawerItemModel;
    TextView tvHeaderModel;
    TextView tvHeaderOnline;
    TextView tvHeaderPO;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.activity_sens_diag);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
 
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();
 
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        View navHeaderMain = navigationView.inflateHeaderView(R.layout.nav_header_main);
        drawerItemModel = (TextView) navHeaderMain.findViewById(R.id.drawerHdrItemModel);
        tvHeaderModel = (TextView) navHeaderMain.findViewById(R.id.tvHeaderModel);
        tvHeaderPO = (TextView) navHeaderMain.findViewById(R.id.tvHeaderPO);
        tvHeaderOnline = (TextView) navHeaderMain.findViewById(R.id.tvHeaderOnline);
        navigationView.setNavigationItemSelectedListener(this);
    }
 
    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }
 
 
 
    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        Intent intent;
        int id = item.getItemId();
 
        if (id == R.id.nav_diag) {
            intent = new Intent(this, SensDiag.class);
            startActivity(intent);
        } else if (id == R.id.nav_mTouch) {
            intent = new Intent(this, SensDiag.class);
            startActivity(intent);
        } else if (id == R.id.nav_slideshow) {
 
        } else if (id == R.id.nav_manage) {
 
        } else if (id == R.id.nav_share) {
 
        } else if (id == R.id.nav_send) {
 
        } else if (id == R.id.nav_main){
            intent = new Intent(this, Main.class);
            startActivity(intent);
        }
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
 
    @Override
    protected void onResume() {
        super.onResume();
        main = new Main(); // экземпляр первого класса
        main.drawHeaderUpdate(); // вызываю метод в котором выкидывается Null
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2016, 14:09     Null при вызове метода из другого класса
Посмотрите здесь:
Android Ошибка приложения при вызове startActivity из другого класса
Вызов метода из другого класса Android
Вызов нестатического метода из другого класса Android
Программа вылетает при вызове метода OnPrepareDialog Android
Android Что происходит при вызове метода popBackStack?
Android Программа вылетает при вызове метода getResourse()
Android Как изменить Textview из другого класса (класса адаптера RecyclerView)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Pablito
2419 / 1864 / 583
Регистрация: 12.05.2014
Сообщений: 6,604
Завершенные тесты: 1
29.09.2016, 14:22     Null при вызове метода из другого класса #2
Цитата Сообщение от MrArty Посмотреть сообщение
с двумя активити NavigationView
Цитата Сообщение от MrArty Посмотреть сообщение
Мне нужно сделать так, чтобы при переходе на другие активити информация в шапке обновлялась из метода первого вью.
изначально все выстроено неверно
я прошлой теме я не стал уже писать, было очевидно что слушать особо никто не будет
лаяут для хидера задается через атрибут NavigationView, а не в коде...короче там больше неправильного было чем правильного
и нет смысла объяснять чтоо именно, ответ такой - бОльшая часть, поэтому все вытереть и начать заново

активити - одна
в ней корневой элемент DrawerLayout в котором AppBarLayout+Toolbar
под ними контейнер для фрагментов

в этот контейнер помещаются нужные фрагменты вместо второй активити

медитировать на этот текст пока не начнет доходить суть
MrArty
0 / 0 / 0
Регистрация: 27.01.2016
Сообщений: 32
29.09.2016, 14:26  [ТС]     Null при вызове метода из другого класса #3
Паблито, т.е. вы советуете использовать фрагменты, верно? А уже в процессе выбора пунктов меню, просто менять фрагменты в активити, верно? Пишу код можно сказать с нуля, опыта нет, нарабатываю опыт и заодно пишу диплом. Так что рад любым замечаниям.
Pablito
2419 / 1864 / 583
Регистрация: 12.05.2014
Сообщений: 6,604
Завершенные тесты: 1
29.09.2016, 14:30     Null при вызове метода из другого класса #4
Цитата Сообщение от MrArty Посмотреть сообщение
использовать фрагменты, верно
да это любой скажет, да
Цитата Сообщение от MrArty Посмотреть сообщение
А уже в процессе выбора пунктов меню, просто менять фрагменты в активити, верно
да, если создать с нуля Naigation бла бла активити то там будет уже готовый метод, который обрабатывает клики по пунктам дровера
MrArty
0 / 0 / 0
Регистрация: 27.01.2016
Сообщений: 32
29.09.2016, 14:34  [ТС]     Null при вызове метода из другого класса #5
Паблито, да, есть такой onNavigationItemSelected(). Правильно ли я понимаю, что есть методы, которые позволяют заменять один фрагмент в контейнере на другой? Это бы очень облегчило мой проект в целом.
Pablito
2419 / 1864 / 583
Регистрация: 12.05.2014
Сообщений: 6,604
Завершенные тесты: 1
29.09.2016, 14:38     Null при вызове метода из другого класса #6
в активити
Java
1
2
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, fragment).commit();
container - это id например FragemLayout-а, в котором будут меняться фрагменты
fragment - созданный фрагмент, например там в onNavigationItemSelected создаем разные фрагменты а потом в конце блока switch-case выполняем транзакцию
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2016, 14:39     Null при вызове метода из другого класса
Еще ссылки по теме:
Вызов метода из другого Activity Android
Android FindViewByID возвращает Null производного класса View
Android Вызов метода из класса в таймере
Android Обращение к методу другого класса
Импорт класса из другого проекта Android

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

Или воспользуйтесь поиском по форуму:
MrArty
0 / 0 / 0
Регистрация: 27.01.2016
Сообщений: 32
29.09.2016, 14:39  [ТС]     Null при вызове метода из другого класса #7
Паблито, спасибо за пояснения. Буду переделывать проект, пока не ушел в дебри)
Yandex
Объявления
29.09.2016, 14:39     Null при вызове метода из другого класса
Ответ Создать тему
Опции темы

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