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

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

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

BaseActivity with drawer + MainActivity + google tabs with view pager = NullPointerException - Программирование Android

03.11.2015, 08:49. Просмотров 275. Ответов 2
Метки нет (Все метки)

Здравствуйте! Такая проблема, у меня есть приложение, в котором drawer должен быть во всех разделах, разделов много, у каждого раздела есть свои табы, у меня они реализованы через специальную библиотеку для создания идентичных google play табов, тут же внутри view pager - мы можем листать табы. drawer у меня инициализируется в BaseActivity, MainActivity наследуется от неё. Всё остальное приложение сделано на фрагментах (каждый раздел со своими вкладками начинается с parent fragment, в котором мы делаем set view pager для трёх наследуемых фрагментов, и тут всё работает отлично), но когда я пытаюсь сделать то же самое для MainActivity, которая является началом самого первого раздела приложения, у меня выпадает null pointer : java.lang.RuntimeException:Unable to start activity ComponentInfo{com.ooosis.manzjetov.ivan.barviha_mobile/com.ooosis.manzjetov.ivan.barviha_mobile.Activities.MainActivity}: java.lang.NullPointerException и ругается на эту строку viewPager_main.setAdapter(mainAdapter);
вот код :

BaseActivity

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
package com.ooosis.manzjetov.ivan.barviha_mobile.Activities;
 
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.FrameLayout;
import android.widget.ListView;
 
import com.ooosis.manzjetov.ivan.barviha_mobile.Adapters.NavigationDrawerAdapter;
import com.ooosis.manzjetov.ivan.barviha_mobile.Fragments.AboutUsFragment;
import com.ooosis.manzjetov.ivan.barviha_mobile.Fragments.BonusCardFragment;
import com.ooosis.manzjetov.ivan.barviha_mobile.Fragments.ContactsFragment;
import com.ooosis.manzjetov.ivan.barviha_mobile.Fragments.MapFragment;
import com.ooosis.manzjetov.ivan.barviha_mobile.Fragments.PhotoGalleryFragment;
import com.ooosis.manzjetov.ivan.barviha_mobile.Fragments.ProfileFragment;
import com.ooosis.manzjetov.ivan.barviha_mobile.Fragments.QuestionsFragment;
import com.ooosis.manzjetov.ivan.barviha_mobile.NavigationItem;
import com.ooosis.manzjetov.ivan.barviha_mobile.R;
 
public class BaseActivity extends AppCompatActivity {
 
    private static int position;
 
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;
    private NavigationItem navigationItemGallery;
 
    private int notifNumber;
 
    private NavigationDrawerAdapter adapter;
    protected Toolbar toolbar;
    protected FrameLayout frameLayout;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.base_activity);
 
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
        setSupportActionBar(toolbar);
 
 
    }
 
    @Override
    public void onBackPressed() {
        if(mDrawerLayout.isDrawerOpen(mDrawerList)) {
            mDrawerLayout.closeDrawer(mDrawerList);}
        else {
            super.onBackPressed();
        }
    }
 
    public void set(final String[] navMenuTitles) {
 
 
        NavigationDrawerAdapter adapter  = new NavigationDrawerAdapter(this);
 
 
        frameLayout = (FrameLayout)findViewById(R.id.content_frame);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);
 
 
 
        String[] menuItemsIcon = getResources().getStringArray(R.array.nav_item_icons);
 
        int res = 0;
        for (String navMenuTitle : navMenuTitles) {
 
            notifNumber = 1;
 
            int id_title = getResources().getIdentifier(navMenuTitle, "string", this.getPackageName());
            int id_icon = getResources().getIdentifier(menuItemsIcon[res], "drawable", this.getPackageName());
            NavigationItem navigationItem = new NavigationItem(id_title, id_icon);
            if (res == 2) {
                navigationItemGallery = navigationItem;
                navigationItem.counter = notifNumber;
            }
            adapter.addItem(navigationItem);
            res++;
        }
 
        if (mDrawerList != null) {
            mDrawerList.setAdapter(adapter);
        }
        mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
 
 
 
 
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 
        }
 
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.string.app_name, // nav drawer open - description for
             
                R.string.app_name // nav drawer close - description for
               
        ) {
            public void onDrawerClosed(View view) {
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
 
            public void onDrawerOpened(View drawerView) {
                getSupportActionBar().setTitle(getString(R.string.app_name));
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
 
            }
 
 
        };
 
 
        final View.OnClickListener originalToolbarListener = mDrawerToggle.getToolbarNavigationClickListener();
 
        getSupportFragmentManager().addOnBackStackChangedListener(
                new FragmentManager.OnBackStackChangedListener() {
                    @Override
                    public void onBackStackChanged() {
                        if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
                            mDrawerToggle.setDrawerIndicatorEnabled(false);
                        } else {
                            mDrawerToggle.setDrawerIndicatorEnabled(true);
                            mDrawerToggle.setToolbarNavigationClickListener(originalToolbarListener);
                        }
                    }
                });
 
 
    }
 
    private class SlideMenuClickListener implements ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            displayView(position);
        }
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(getSupportFragmentManager().getBackStackEntryCount() == 0 || getSupportFragmentManager().getBackStackEntryCount() == 1) {
            if (item.getItemId() == android.R.id.home) {
                if (mDrawerLayout.isDrawerOpen(mDrawerList)) {
                    mDrawerLayout.closeDrawer(mDrawerList);
                } else {
                    mDrawerLayout.openDrawer(mDrawerList);
                }
            }
        }
        return super.onOptionsItemSelected(item);
    }
 
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        return super.onPrepareOptionsMenu(menu);
    }
 
    private void displayView(int position) {
        BaseActivity.position = position;
 
        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new ProfileFragment();
                break;
            case 1:
                fragment = new AboutUsFragment();
                break;
            case 2:
                fragment = new PhotoGalleryFragment();
                notifNumber = 0;
                navigationItemGallery.counter = notifNumber;
 
                invalidateOptionsMenu();
                break;
            case 3:
                fragment = new QuestionsFragment();
                break;
            case 4:
                fragment = new BonusCardFragment();
                break;
            case 5:
                fragment = new ContactsFragment();
                break;
            case 6:
                fragment = new MapFragment();
                break;
            default:
                break;
        }
        if (fragment != null) {
            android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.content_frame, fragment)
                    .addToBackStack(null)
                    .commit();
 
        } else {
            Log.e(this.getClass().getName(), "Error. Fragment is not created");
        }
 
        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);
        mDrawerLayout.closeDrawer(mDrawerList);
    }
 
 
    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mDrawerToggle.syncState();
    }
 
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // Pass any configuration change to the drawer toggls
        mDrawerToggle.onConfigurationChanged(newConfig);
    }
}
MainActivity

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
package com.ooosis.manzjetov.ivan.barviha_mobile.Activities;
 
import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.MenuItem;
 
import com.astuetz.PagerSlidingTabStrip;
import com.ooosis.manzjetov.ivan.barviha_mobile.Adapters.SaleAdapter;
import com.ooosis.manzjetov.ivan.barviha_mobile.Fragments.FeedFragment;
import com.ooosis.manzjetov.ivan.barviha_mobile.Fragments.MainFragment;
import com.ooosis.manzjetov.ivan.barviha_mobile.Preferences;
import com.ooosis.manzjetov.ivan.barviha_mobile.R;
 
 
public class MainActivity extends BaseActivity {
 
    SaleAdapter mSaleAdapter;
    ViewPager mViewPager;
 
 
    FragmentPagerAdapter mainAdapter;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getLayoutInflater().inflate(R.layout.activity_main, frameLayout);
 
        ViewPager viewPager_main = (ViewPager)findViewById(R.id.view_pager);
 
        mainAdapter = new MainAdapter(getSupportFragmentManager(),MainActivity.this);
        viewPager_main.setAdapter(mainAdapter);
 
        PagerSlidingTabStrip tabs = (PagerSlidingTabStrip)findViewById(R.id.tabs);
        tabs.setViewPager(viewPager_main);
 
       
      <...>
 
        String[] navMenuItems = getResources().getStringArray(R.array.nav_drawer_items);
        set(navMenuItems);
 
        if (savedInstanceState == null) {
            android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.content_frame, new MainFragment())
//                    .addToBackStack(null)
                    .commit();
        }
    }
 
   
 
    public class MainAdapter extends FragmentPagerAdapter {
        private int NUM_ITEMS = 3;
        private String[] titles;
        private Context context;
 
        public MainAdapter(FragmentManager fm, Context context) {
            super(fm);
            this.context = context;
 
            Resources res = getResources();
            titles = res.getStringArray(R.array.main_title_items);
        }
 
        @Override
        public int getCount() {
            return NUM_ITEMS;
        }
 
        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return new MainFragment();
                //case 1:
                   // return new EventFragment();
 
                case 2:
                    return new FeedFragment();
                default:
                    return null;
            }
        }
 
        @Override
        public CharSequence getPageTitle(int position) {
            return titles[position];
        }
    }
 
 
}
activity_base.xml
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
27
28
29
30
31
32
33
34
35
36
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <include
        android:id="@+id/toolbar_actionbar"
        layout="@layout/toolbar_default"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
 
    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/toolbar_actionbar">
 
        <FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
 
        <!-- The navigation drawer -->
        <ListView android:id="@+id/left_drawer"
            android:layout_width="260dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp"
            android:background="#FFFFFF"/>
 
    </android.support.v4.widget.DrawerLayout>
</RelativeLayout>
activity_main.xml

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
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <com.astuetz.PagerSlidingTabStrip
      android:id="@+id/tabs"
      android:layout_width="match_parent"
      android:layout_height="48dip"
      app:pstsShouldExpand="true"
      app:pstsTextAllCaps="true"/>
 
  <android.support.v4.view.ViewPager
      android:id="@+id/view_pager"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:background="@drawable/bcgr"
      android:layout_below="@+id/tabs">
 
  </android.support.v4.view.ViewPager>
 
</FrameLayout>

Пожалуйста, подскажите любой способ решения проблемы, можно и структуру проекта поменять, главное чтобы заработало нормально! Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2015, 08:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос BaseActivity with drawer + MainActivity + google tabs with view pager = NullPointerException (Программирование Android):

View Pager с картинками - Программирование Android
Всем привет. Есть view pager с картинками (image view) 1- как сделать так чтобы пользователь мог скачать (сохранить) понравившиюся картинку...

View Pager разные фрагменты на страницах, не понимаю как? - Программирование Android
помогите догнать куда вставить код из Main'а который отображает разные фрагменты: есть два файла MainActivity public class...

Google Maps + jQuery UI Tabs on Wordpress (dogshow me/contact) - jQuery
Мне нужно на странице контактов (dogshow.me/contact) разместить 2 карты Google с метками, для чего я воспользовался шорткодами jQuery UI...

Google Street View API - JavaScript
Здравствуйте! Мне понадобилось использовать Google Street View API на своем сайте. Дело в том, что на сайте гугла я нашол такую...

В Google Chrome появился вирус View Similar - Удаление вирусов
Добрый день! В Google Chrome появился вирус View Similar. Создает множество неудобств. При выводе ПК из сна отключает AdBlock, в youtube...

В чем разница (View view) и (View v) - Программирование Android
Я только начинаю изучать программирование под андроид (до этого вобще программированием не занимался), по гуглу удалось найти только...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Pablito
2471 / 1916 / 595
Регистрация: 12.05.2014
Сообщений: 6,741
Завершенные тесты: 1
03.11.2015, 09:55 #2
много кода
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
03.11.2015, 10:14 #3
Цитата Сообщение от Kotleee Посмотреть сообщение
Java
1
getLayoutInflater().inflate(R.layout.activity_main, frameLayout);
А вот это что? Там разве не должно быть
Java
1
setContentView(R.layout.activity_main);
В вашем коде вьюшка инфлейтится но вникуда. И активити остается пустой, конечно в ней ничего найти не выйдет и viewPager_main будет равен null.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2015, 10:14
Привет! Вот еще темы с ответами:

Как во view добавить вычисляемую колонку с порядковым номером записи во view? - SQL Server
Как во view добавить вычисляемую колонку с порядковым номером записи во view?

view с чего состоит и что выполняет каждая функция в view? - Delphi
Буду очень благодарен за ответ!!

По нажатию кнопки на View Controllere открыть Table View Controller - Программирование iOS
Как по нажатию кнопки на View Controllere открыть Table View Controller

Как передать параметры из одного View в EditorFor другого View - C# MVC
Здравствуйте. Есть 2 view, первое просто отображает данные, 2 должно их редактировать, в 1 view есть текст, необходимо передать этот текст...


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

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

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