2013-09-29 5 views
1

У меня есть метод в моем классе MainActivity, с которым я получаю доступ из разных классов активности для создания экземпляров Tabs в панели приложений для всех других действий.actionBar.addTab throwing NullPointerException

Однако, когда я делаю вызов из класса этой функции в классе MainActivity его thwroing в java.lang.NullPointerException:

Моя функция в MainActivity.Java

public void initiateMenuTabs(ActionBar actionBar) { 

    try { 
     actionBar.setDisplayShowTitleEnabled(false); 
     actionBar.setDisplayUseLogoEnabled(true); 

     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     ActionBar.TabListener tabListener = new ActionBar.TabListener() { 

      @Override 
      public void onTabUnselected(Tab arg0, FragmentTransaction arg1) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onTabSelected(Tab tab, FragmentTransaction arg1) { 
       int tabPosition = tab.getPosition(); 
       switch (tabPosition) { 
       case 0: 
        setContentView(R.layout.event_feed); 
        break; 
       case 1: { 
        Intent startClassActivity = new Intent(MainActivity.this, 
          ClassWide.class); 
        startActivity(startClassActivity); 
        break; 
       } 
       case 2: 
        setContentView(R.layout.event_feed); 
        break; 
       } 

      } 

      @Override 
      public void onTabReselected(Tab arg0, FragmentTransaction arg1) { 
       // TODO Auto-generated method stub 

      } 
     }; 

     actionBar.addTab(actionBar.newTab().setText("Event Feed") 
       .setIcon(R.drawable.ic_action_alarms) 
       .setTabListener(tabListener)); 
     actionBar.addTab(actionBar.newTab().setText("Wide") 
       .setIcon(R.drawable.ic_action_Wide) 
       .setTabListener(tabListener)); 
     actionBar.addTab(actionBar.newTab().setText("Report") 
       .setIcon(R.drawable.ic_action_location_found) 
       .setTabListener(tabListener)); 
    } catch (Exception e) { 
     Log.getStackTraceString(e.getCause().getCause()); 

    } 

} 

вызывающую функцию от ClassWide.Java

protected void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.wide_view); 
    MainActivity cObj = new MainActivity(); 
    cObj.initiateMenuTabs(getActionBar()); 
      .... .... 

LogCat окно показывает это:

09-29 15:21:09.217: E/AndroidRuntime(2549): FATAL EXCEPTION: main 
09-29 15:21:09.217: E/AndroidRuntime(2549): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.helloworld.projectone/com.helloworld.projectone.ClassWide}: java.lang.NullPointerException 
09-29 15:21:09.217: E/AndroidRuntime(2549):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
09-29 15:21:09.217: E/AndroidRuntime(2549):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
09-29 15:21:09.217: E/AndroidRuntime(2549):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
09-29 15:21:09.217: E/AndroidRuntime(2549):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
09-29 15:21:09.217: E/AndroidRuntime(2549):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-29 15:21:09.217: E/AndroidRuntime(2549):  at android.os.Looper.loop(Looper.java:137) 
09-29 15:21:09.217: E/AndroidRuntime(2549):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
09-29 15:21:09.217: E/AndroidRuntime(2549):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-29 15:21:09.217: E/AndroidRuntime(2549):  at java.lang.reflect.Method.invoke(Method.java:525) 
09-29 15:21:09.217: E/AndroidRuntime(2549):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
09-29 15:21:09.217: E/AndroidRuntime(2549):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
09-29 15:21:09.217: E/AndroidRuntime(2549):  at dalvik.system.NativeStart.main(Native Method) 
09-29 15:21:09.217: E/AndroidRuntime(2549): Caused by: java.lang.NullPointerException 
09-29 15:21:09.217: E/AndroidRuntime(2549):  at com.helloworld.projectone.MainActivity.initiateMenuTabs(MainActivity.java:79) 
09-29 15:21:09.217: E/AndroidRuntime(2549):  at com.helloworld.projectone.ClassWide.onCreate(ClassWide.java:21) 
09-29 15:21:09.217: E/AndroidRuntime(2549):  at android.app.Activity.performCreate(Activity.java:5133) 
09-29 15:21:09.217: E/AndroidRuntime(2549):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
09-29 15:21:09.217: E/AndroidRuntime(2549):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
09-29 15:21:09.217: E/AndroidRuntime(2549):  ... 11 more 
+0

что отчет исключение? Измените это на свой вопрос. – tbodt

+0

Как я могу получить отчет об исключениях? Вы имеете в виду вывод logCat? – Maven

+0

добавлен, проверьте сейчас plz. – Maven

ответ

1

Вы создаете приложение для Android в другой деятельности. Активность - это больше, чем простой класс в android, . Что вы должны сделать, чтобы вызвать свой метод из любой интересующей вас деятельности, - это определить вашу базовую активность, которая содержит методы, общие для всех видов деятельности, и расширить ее, а не расширять общую активность класс:

public class BaseActivity extends Activity { 

    public void initiateMenuTabs(ActionBar actionBar) { 
     ....//your code 
    } 
} 

затем расширить BaseActivity в любой другой деятельности, который должен вызвать метод initiateMenuTabs

public ClassWide extends BaseActivity{ 

    protected void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.wide_view); 

     initiateMenuTabs(getActionBar());// here it will call the method from the parent (BaseActivity) 
      .... .... 
+0

Но не каждый класс, использующий эту функцию, является 'Activity', некоторые из них также являются« FragmentActivity », чем я их создавал? – Maven

+0

FragmentActivity наследует от Activity, поэтому вы не должны создавать экземпляр, как обычный класс, используя «новый FragmentActivity», если вы хотите запустить Activity, вы должны сделать это с помощью намерений, и если вы хотите использовать один и тот же метод для всех своих activity/fragmentactivities, то вы должны сделать свой метод статическим и передать контекст в качестве параметра и использовать контекст внутри метода – Turkish

+0

Или написать BaseFragmentActivity, что все ваши фрагменты будут расширяться – Turkish

Смежные вопросы