0

我正在用兩個片段之間的actionbarnavigator開發一個應用程序,這意味着我有兩個不同的用戶視圖,誰可以在它們之間滑動。一個片段有一個按鈕,該按鈕打開另一個活動,以在列表視圖中顯示來自數據庫的信息。但是當我點擊按鈕時,我變成了一個nullpointerexception。我不知道爲什麼。我希望s.o.可以幫我。NullpointerException無法啓動活動componentInfo

這裏是在MainActivity

public class MainActivity extends ActionBarActivity implements ActionBar.TabListener { 

SectionsPagerAdapter mSectionsPagerAdapter; 
Debtor debtor; 
Creditor creditor; 
public DataBaseHandler myDBHandler; 
ViewPager mViewPager; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final ActionBar actionBar = getActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 
    mViewPager = (ViewPager) findViewById(R.id.pager); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 

    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
       @Override 
       public void onPageSelected(int position) { 
        actionBar.setSelectedNavigationItem(position); 
       } 
      }); 

    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
     actionBar.addTab(actionBar.newTab() 
       .setText(mSectionsPagerAdapter.getPageTitle(i)) 
       .setTabListener(this)); 
    } 
} 

@Override 
protected void onResume() { 
    super.onResume(); 

    initFragments(); 
    openDB(); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    closeDB(); 
} 

private void initFragments() { 
    debtor = (Debtor)mSectionsPagerAdapter.getItem(0); 
    creditor = (Creditor)mSectionsPagerAdapter.getItem(1); 
} 

private void openDB() { 
    myDBHandler = new DataBaseHandler(this); 
    myDBHandler.open(); 
} 

private void closeDB() { 
    myDBHandler.close(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 


@Override 
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    mViewPager.setCurrentItem(tab.getPosition()); 
} 

@Override 
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
} 

@Override 
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
} 
} 

片段類

public class Debtor extends Fragment { 

private Button showDebtorsHistory; 
MainActivity mainActivity; 

public static final String ARG_SECTION_NUMBER = "section_number"; 

public Debtor(int position) {  
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    mainActivity = (MainActivity) getActivity(); 

    View v = inflater.inflate(R.layout.debtor, container, false); 

    showDebtorsHistory = (Button)v.findViewById(R.id.button1); 

    showDebtorsHistory.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      Intent i = new Intent(getActivity(), DebtorHistory.class);    
      startActivityForResult(i, 100); 
     } 
    }); 

    return v; 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     mainActivity = (MainActivity) activity; 
    } 
    catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() + " Fehler: Keine MainActivity-Instanz!"); 
    } 
} 
} 

和活性,其具有要被運行結束時,按鈕被點擊

public class DebtorHistory extends Activity { 

Cursor cursor; 
private ListView mainList; 
MainActivity mainActivity; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.debtor_history); 

    mainList = (ListView)findViewById(R.id.listView_Debtors); 
    populateListViewFromDB(); 

} 

@SuppressWarnings("deprecation") 
public void populateListViewFromDB() {                   
    cursor = mainActivity.myDBHandler.getAllDifferentNames1(); 

    String[] colmn = new String[] {"n", "i", "d"}; 

    int[] tolist = new int[] {R.id.txt_name,       
            R.id.list_userImage, 
            R.id.datum }; 

    SimpleCursorAdapter myCursorAdapter 
      = new SimpleCursorAdapter 
         (this, R.layout.history_listrow, cursor, colmn, tolist); 

    mainList.setAdapter(myCursorAdapter); 
} 

} 

的logcat的消息時

01-28 15:19:31.967: E/AndroidRuntime(1205): java.lang.RuntimeException: Unable to start activity ComponentInfo{***.debtmanagerpro/***.debtmanagerpro.DebtorHistory}: java.lang.NullPointerException 
01-28 15:19:31.967: E/AndroidRuntime(1205):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2073) 
01-28 15:19:31.967: E/AndroidRuntime(1205):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2098) 
01-28 15:19:31.967: E/AndroidRuntime(1205):  at android.app.ActivityThread.access$600(ActivityThread.java:138) 
01-28 15:19:31.967: E/AndroidRuntime(1205):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1204) 
01-28 15:19:31.967: E/AndroidRuntime(1205):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-28 15:19:31.967: E/AndroidRuntime(1205):  at android.os.Looper.loop(Looper.java:137) 
01-28 15:19:31.967: E/AndroidRuntime(1205):  at android.app.ActivityThread.main(ActivityThread.java:4872) 
01-28 15:19:31.967: E/AndroidRuntime(1205):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-28 15:19:31.967: E/AndroidRuntime(1205):  at java.lang.reflect.Method.invoke(Method.java:511) 
01-28 15:19:31.967: E/AndroidRuntime(1205):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
01-28 15:19:31.967: E/AndroidRuntime(1205):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
01-28 15:19:31.967: E/AndroidRuntime(1205):  at dalvik.system.NativeStart.main(Native Method) 
01-28 15:19:31.967: E/AndroidRuntime(1205): Caused by: java.lang.NullPointerException 
01-28 15:19:31.967: E/AndroidRuntime(1205):  at ***.debtmanagerpro.DebtorHistory.populateListViewFromDB(DebtorHistory.java:30) 
01-28 15:19:31.967: E/AndroidRuntime(1205):  at ***.debtmanagerpro.DebtorHistory.onCreate(DebtorHistory.java:23) 
01-28 15:19:31.967: E/AndroidRuntime(1205):  at android.app.Activity.performCreate(Activity.java:5191) 
01-28 15:19:31.967: E/AndroidRuntime(1205):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1082) 
01-28 15:19:31.967: E/AndroidRuntime(1205):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2037) 
01-28 15:19:31.967: E/AndroidRuntime(1205):  ... 11 more 

DebtorHistory中的第23行是populateListViewFromDB();和30是cursor = mainActivity.myDBHandler.getAllDifferentNames1();

在此先感謝。

編輯:

public class DebtorHistory extends Activity { 

Cursor cursor; 
private ListView mainList; 
DataBaseHandler myDBHandler; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.debtor_history); 

    mainList = (ListView)findViewById(R.id.listView_Debtors); 
    populateListViewFromDB(); 

} 

@Override 
protected void onResume() { 
    super.onResume(); 

    myDBHandler = new DataBaseHandler(this); 
    myDBHandler.open(); 
} 

@SuppressWarnings("deprecation") 
public void populateListViewFromDB() {                  //MainList mit Werten aus der db befüllen 

    try { 
     startManagingCursor(cursor = myDBHandler.getAllDifferentNames1()); 
    } catch (Exception e) { 
     if(cursor == null) { 
      Log.e("#################", "is null :("); 
     } 

    } 
    ; 

    String[] colm= new String[] {"n", "i", "d"}; 

    int[] tolist= new int[] {R.id.txt_name, R.id.list_userImage, R.id.datum }; 

    SimpleCursorAdapter myCursorAdapter 
      = new SimpleCursorAdapter 
         (this, R.layout.history_listrow, cursor, colm, tolist); 

    mainList.setAdapter(myCursorAdapter); 
} 

} 
+0

我認爲mainActivity對象沒有初始化.. –

回答

1

我認爲這個問題是在方法populateListViewFromDb()。試圖獲取遊標時可能會遇到空指針異常。調試該方法,看看你得到了什麼。

+0

是的,它的遊標。但如何解決它? – user1953173

+0

你應該有一個db helper類。查看這個答案中的一個例子:http://stackoverflow.com/questions/3548533/what-is-a-full-android-database-helper-class-for-an-existing-sqlite-database –

+0

你然後創建該dbhelper類的實例以在您的活動中使用。 –

0

您不能簡單地從其他活動訪問活動。

mainActivity永遠不會在DebtorActivity初始化,所以NullPointerException,當你調用mainActivity的函數populateListViewFromDb是合理的:

cursor = mainActivity.myDBHandler.getAllDifferentNames1(); 

你將不得不尋找另一種方式傳遞到數據庫到第二Activity

我建議爲數據庫訪問構建一個輔助類,並在您的Activities中使用它。

+0

我明白了。但你能給我一個建議嗎? – user1953173

相關問題