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

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

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

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

29.09.2016, 14:09. Просмотров 217. Ответов 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
Возникла проблема, программа валится при вызове метода enableBt() Класс со static методами: package my.bluetooth; import...

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

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

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

Что происходит при вызове метода popBackStack? - Программирование Android
Всем привет ;-) Буду благодарен за подробнее обьснение. Читаю android Developers не могу понять принцип работы функции, popBackStack()....

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

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

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

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

медитировать на этот текст пока не начнет доходить суть
MrArty
0 / 0 / 0
Регистрация: 27.01.2016
Сообщений: 32
29.09.2016, 14:26  [ТС] #3
Паблито, т.е. вы советуете использовать фрагменты, верно? А уже в процессе выбора пунктов меню, просто менять фрагменты в активити, верно? Пишу код можно сказать с нуля, опыта нет, нарабатываю опыт и заодно пишу диплом. Так что рад любым замечаниям.
Pablito
2471 / 1916 / 595
Регистрация: 12.05.2014
Сообщений: 6,741
Завершенные тесты: 1
29.09.2016, 14:30 #4
Цитата Сообщение от MrArty Посмотреть сообщение
использовать фрагменты, верно
да это любой скажет, да
Цитата Сообщение от MrArty Посмотреть сообщение
А уже в процессе выбора пунктов меню, просто менять фрагменты в активити, верно
да, если создать с нуля Naigation бла бла активити то там будет уже готовый метод, который обрабатывает клики по пунктам дровера
MrArty
0 / 0 / 0
Регистрация: 27.01.2016
Сообщений: 32
29.09.2016, 14:34  [ТС] #5
Паблито, да, есть такой onNavigationItemSelected(). Правильно ли я понимаю, что есть методы, которые позволяют заменять один фрагмент в контейнере на другой? Это бы очень облегчило мой проект в целом.
Pablito
2471 / 1916 / 595
Регистрация: 12.05.2014
Сообщений: 6,741
Завершенные тесты: 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 выполняем транзакцию
MrArty
0 / 0 / 0
Регистрация: 27.01.2016
Сообщений: 32
29.09.2016, 14:39  [ТС] #7
Паблито, спасибо за пояснения. Буду переделывать проект, пока не ушел в дебри)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2016, 14:39
Привет! Вот еще темы с ответами:

Ошибка при вызове приложения из другого приложения - Программирование Android
Сделано два простеньких приложения и я хочу чтобы одно приложение запускало другое. В приложении, которое будет запущено установлен фильтр...

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

Как изменить Textview из другого класса (класса адаптера RecyclerView) - Программирование Android
У меня есть список RecyclerView тоесть этот файл Basket и файл что реализует cardwiew BasketAdapter. как мне изменить TextView allPrice из...

Вызов метода из другого Activity - Программирование Android
Здраствуйте. Помогите,пожалуйста, разобраться с несколькими вопросами: 1) Правильно ли, что &quot;Настройки&quot; я выделил в отдельный Activity ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.09.2016, 14:39
Ответ Создать тему
Опции темы

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