0

Я разрабатываю приложение с помощью actionbarnavigator между двумя фрагментами, это означает, что у меня есть два разных представления для пользователя, которые могут прокручивать между ними. один фрагмент имеет кнопку, которая открывает другое действие для отображения информации из базы данных в виде списка. но когда я нажимаю на кнопку, я стал nullpointerexception. Я не знаю почему. я надеюсь, что s.o. может помочь мне.NullpointerException Не удалось запустить Activity 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 

строка 23 в DebtorHistory is populateListViewFromDB(); и 30 - cursor = mainActivity.myDBHandler.getAllDifferentNames1();

благодарит заранее.

EDIT:

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(). Возможно, вы получаете исключение nullpointer при попытке получить курсор. Отлаживайте этот метод и смотрите, что вы получаете.

+0

да, его курсор. но как это исправить? – user1953173

+0

У вас должен быть вспомогательный класс db. В этом примере выберете вариант: 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

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