0

У меня есть сетчатый вид альбомов внутри фрейма viewpager. Идея состоит в том, чтобы отобразить содержимое альбома в новом окне при нажатии на элемент сетки. Вот мой код:Почему активность не создается?

Внутри onCreateView() метод Albums фрагмента:

GridView grid = (GridView) getView().findViewById(R.id.grid); 


    grid.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      TextView al = (TextView) view.findViewById(R.id.album_name); 
      TextView ar = (TextView) view.findViewById(R.id.songs_num); 

      String album_name = (String) al.getText(); 
      String artist_name = (String) ar.getText(); 
      startActivity(new Intent(getActivity().getApplicationContext(), DisplayAlbumContent.class).putExtra("pos", position).putExtra("album_name", album_name).putExtra("artist_name", artist_name)); 
     } 
    }); 

Вот DisplayAlbumContent.java:

public class DisplayAlbumContent extends Activity implements LoaderManager.LoaderCallbacks<Cursor>{ 
DisplaySongsAdapter mAdapter; 

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



} 
Intent i = getIntent(); 
Bundle b = i.getExtras(); 
String val[] = {(String) b.getCharSequence("album_name")}; 


static final String[] ALBUM_DETAIL_PROJECTION = { MediaStore.Audio.Media._ID,MediaStore.Audio.Media.ALBUM_ID, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.DURATION}; 
String where = MediaStore.Audio.Media.ALBUM + "=?"; 




public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    String orderby = MediaStore.Audio.Media.TITLE; 
    return new CursorLoader(this, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,ALBUM_DETAIL_PROJECTION, where, val, orderby); 
} 



public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    mAdapter.swapCursor(data); 
} 



public void onLoaderReset(Loader<Cursor> loader) { 
    mAdapter.swapCursor(null); 
} 
} 

Однако я получаю следующее сообщение об ошибке:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.tekinarslan.material.sample/com.screens.DisplayAlbumContent}: java.lang.NullPointerException 
     at 
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2264) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
     at android.app.ActivityThread.access$800(ActivityThread.java:151) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) 
     at android.os.Handler.dispatchMessage(Handler.java:110) 
     at android.os.Looper.loop(Looper.java:193) 
     at android.app.ActivityThread.main(ActivityThread.java:5292) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
     at com.screens.DisplayAlbumContent.<init>(DisplayAlbumContent.java:29) 
     at java.lang.Class.newInstanceImpl(Native Method) 
     at java.lang.Class.newInstance(Class.java:1215) 
     at android.app.Instrumentation.newActivity(Instrumentation.java:1061) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2255) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
     at android.app.ActivityThread.access$800(ActivityThread.java:151) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) 
     at android.os.Handler.dispatchMessage(Handler.java:110) 
     at android.os.Looper.loop(Looper.java:193) 
     at android.app.ActivityThread.main(ActivityThread.java:5292) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) 
     at dalvik.system.NativeStart.main(Native Method) 
+1

Поскольку есть NullPointerException в строке 29 класса DisplayAlbumContent, пожалуйста, после того, что есть в номере строки 29 – nvinayshetty

ответ

1

Предполагая, что вы разместили точную версию своего кода, это вызовет проблемы:

Intent i = getIntent(); 
Bundle b = i.getExtras(); 
String val[] = {(String) b.getCharSequence("album_name")}; 

Они объявлены как поля в вашем классе, что означает, что они будут инициализированы при создании экземпляра класса. Но когда Android создает экземпляр этого класса для вас, он еще не поставил цель. Это означает, что i, вероятно, получит значение null от getIntent(), в результате чего NPE произойдет на следующей строке, когда вызывается i.getExtras().

Вам необходимо перенести инициализацию этих полей в метод onCreate(). На этом этапе Intent будет установлен в вашем экземпляре Activity.

public class DisplayAlbumContent extends Activity implements LoaderManager.LoaderCallbacks<Cursor>{ 
DisplaySongsAdapter mAdapter; 

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

     this.i = getIntent(); 
     this.b = i.getExtras(); 
     this.val = new String[] {(String) this.b.getCharSequence("album_name")}; 
    } 

    Intent i; 
    Bundle b; 
    String[] val; 

} 

Несколько другие ноты:

  • Вы должны войти в привычку использовать чуть более описательный имена для переменных; много i's, b и val s получает смущает очень быстро.
  • Это также обычное в Java, чтобы положить скобки массив типа [] рядом с типа, а не рядом с переменной - как я сделал выше (хотя они и имеют тот же эффект).
  • Обратите внимание на комментарий от @DroidMind - logcat помогает вам , где ошибка, которая должна дать вам подсказку о том, как ее исправить.
+0

Когда я делаю, что я получаю другую ошибку, поскольку эти значения отображаются красным цветом в следующих методах погрузчиком –

+0

не делают переместите поля - только их инициализацию. Я добавлю код в свой ответ. – adelphus

+0

Спасибо. Это сработало. Но теперь новая проблема. Новое действие пустое. Оно не заполняет активность элементами из альбома. –

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