2013-09-29 2 views
1

다른 액티비티 클래스에서 액세스하는 다른 MainActivity 클래스의 메서드를 사용하여 다른 모든 작업에 대한 응용 프로그램 막대의 탭을 인스턴스화합니다. ClassWide.JavaactionBar.addTab throw NullPointerException

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

내 기능

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()); 

    } 

} 

MainActivity.Java의 기능 : 나는 MainActivity 클래스에서이 함수에 클래스의 호출을하고 때

그러나 그는 java.lang.NullPointerException을 thwroing

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

예외 보고서는 무엇입니까 호출해야 다른 활동에 BaseActivity을 확장? 그 질문을 편집하십시오. – tbodt

+0

어떻게 예외 보고서를받을 수 있습니까? logCat 출력을 의미합니까? – Maven

+0

가 추가되었습니다. 지금 plz을 확인하십시오. – Maven

답변

1

다른 활동 내에서 Android 활동을 인스턴스화합니다. 액티비티는 안드로이드의 단순한 클래스 이상입니다. 원하는 액티비티에서 메서드를 호출하기 위해해야 ​​할 일은 모든 액티비티에 공통적 인 메서드가 포함 된 BaseActivity를 정의하고 일반 액티비티를 확장하는 대신 액티비티를 확장하는 것입니다 클래스 :

public class BaseActivity extends Activity { 

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

는 다음 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에서 상속되므로 'new FragmentActivity'를 사용하는 일반 클래스처럼 인스턴스화하면 안됩니다. 의도를 통해 수행해야하는 활동을 시작하려는 경우 및 모든 메소드에서 동일한 메소드를 공유하려는 경우 activities/fragmentactivities를 사용한다면 메소드를 정적으로 만들고 Context를 매개 변수로 전달하고 메서드 내에서 컨텍스트를 사용해야합니다. – Turkish

+0

또는 모든 fragmentActivities가 확장하는 BaseFragmentActivity를 작성합니다 – Turkish