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

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

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

Ошибка приложения при вызове startActivity из другого класса
Возникла проблема, программа валится при вызове метода enableBt() Класс со...

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

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

Программа вылетает при вызове метода getResourse()
07-31 17:48:23.338 25853-25853/spsoft.passwordgenerator E/AndroidRuntime: FATAL...

Что происходит при вызове метода popBackStack?
Всем привет ;-) Буду благодарен за подробнее обьснение. Читаю android...

Программа вылетает при вызове метода OnPrepareDialog
Здравствуйте, уважаемые программисты! Не могли бы вы мне помочь? Дело в том,...

6
Pablito
2644 / 2126 / 725
Регистрация: 12.05.2014
Сообщений: 7,432
Завершенные тесты: 1
29.09.2016, 14:22 #2
Цитата Сообщение от MrArty Посмотреть сообщение
с двумя активити NavigationView
Цитата Сообщение от MrArty Посмотреть сообщение
Мне нужно сделать так, чтобы при переходе на другие активити информация в шапке обновлялась из метода первого вью.
изначально все выстроено неверно
я прошлой теме я не стал уже писать, было очевидно что слушать особо никто не будет
лаяут для хидера задается через атрибут NavigationView, а не в коде...короче там больше неправильного было чем правильного
и нет смысла объяснять чтоо именно, ответ такой - бОльшая часть, поэтому все вытереть и начать заново

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

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

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

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

Ошибка при вызове приложения из другого приложения
Сделано два простеньких приложения и я хочу чтобы одно приложение запускало...

Ошибка при использовании метода 1 класса во 2 классе
public LinearLayout LayoutOfScroll; public EditText edBudget; public TextView...

Как изменить Textview из другого класса (класса адаптера RecyclerView)
У меня есть список RecyclerView тоесть этот файл Basket и файл что реализует...


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

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

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