2016-12-31 4 views
0

EDIT С Новым годом! Чтобы быть точным, я создал простое музыкальное приложение в Android Studio, которое читает mp3-файлы из моего внутреннего хранилища. Все хорошо, пока я не решил разместить одно случайное изображение на каждой дорожке в списке. (Перед названием песни я хочу отобразить одно изображение). Когда я выбираю одно изображение в 'src' в ImageView, он работает и отображается для всех песен. Я ATACH часть моего кода ниже: Основная деятельность:Мое приложение останавливается каждый раз, когда я его загружаю

package com.alg.amzar.spectrum; 

import android.content.ContentResolver; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.ImageView; 
import android.widget.ListView; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.Random; 


public class MainActivity extends AppCompatActivity { 

static { 
    System.loadLibrary("native-lib"); 
} 
private ArrayList<Song> songList; 
private ListView songView; 


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

    schimbare(); 

    songView = (ListView)findViewById(R.id.song_list); 
    songList = new ArrayList<Song>(); 

    getSongList(); 

    Collections.sort(songList, new Comparator<Song>(){ 
     public int compare(Song a, Song b){ 
      return a.getTitle().compareTo(b.getTitle()); 
     } 
    }); 

    SongAdapter songAdt = new SongAdapter(this, songList); 
    songView.setAdapter(songAdt); 


} 

public void schimbare() { 
    int[] photos={R.drawable.img_0, R.drawable.img_1,R.drawable.img_2}; 

    ImageView image = (ImageView) findViewById(R.id.imagine); 

    Random ran=new Random(); 
    int i=ran.nextInt(photos.length); 
    image.setImageResource(photos[i]); 
} 

public void getSongList() { 
    ContentResolver musicResolver = getContentResolver(); 
    Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null); 

    if(musicCursor!=null && musicCursor.moveToFirst()){ 
     //get columns 
     int titleColumn = musicCursor.getColumnIndex 
       (android.provider.MediaStore.Audio.Media.TITLE); 
     int idColumn = musicCursor.getColumnIndex 
       (android.provider.MediaStore.Audio.Media._ID); 
     //add songs to list 
     do { 
      long thisId = musicCursor.getLong(idColumn); 
      String thisTitle = musicCursor.getString(titleColumn); 
      songList.add(new Song(thisId, thisTitle)); 
     } 
     while (musicCursor.moveToNext()); 
    } 
} 

public native String stringFromJNI(); 
} 

активность Главная .xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
android:background="#FF330000" 
tools:context=".MainActivity" > 

<ListView 
    android:id="@+id/song_list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
</ListView> 

</LinearLayout> 

Song.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:onClick="songPicked" 
android:orientation="vertical" 
android:padding="5dp" > 

<ImageView 
    android:layout_width="70dp" 
    android:id="@+id/imagine" 
    android:layout_height="50dp" /> 

<TextView 
    android:id="@+id/song_title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textColor="#FFFFFF99" 
    android:textSize="15sp" 
    android:textStyle="bold" 
    android:layout_marginBottom="20dp" 
    android:layout_marginLeft="75dp" 
    android:layout_marginTop="-42dp"/> 


</LinearLayout> 

Кроме этого, у меня есть 2 больше классов java. Я думаю, что проблема здесь, но ИДК, что это не так:

public void schimbare() { 
    int[] photos={R.drawable.img_0, R.drawable.img_1,R.drawable.img_2}; 

    ImageView image = (ImageView) findViewById(R.id.imagine); 

    Random ran=new Random(); 
    int i=ran.nextInt(photos.length); 
    image.setImageResource(photos[i]); 
} 

Еще интересно мое это то, что «осуждается» означает, когда это я использую .getDrawable. Спасибо заранее!

Logcat:

ime: FATAL EXCEPTION: main 
                    Process: com.alg.amzar.spectrum, PID: 28677 
                    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.alg.amzar.spectrum/com.alg.amzar.spectrum.MainActivity}: java.lang.NullPointerException 
                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2381) 
                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2433) 
                     at android.app.ActivityThread.access$800(ActivityThread.java:155) 
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1346) 
                     at android.os.Handler.dispatchMessage(Handler.java:110) 
                     at android.os.Looper.loop(Looper.java:193) 
                     at android.app.ActivityThread.main(ActivityThread.java:5341) 
                     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:830) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:646) 
                     at dalvik.system.NativeStart.main(Native Method) 
                    Caused by: java.lang.NullPointerException 
                     at com.alg.amzar.spectrum.MainActivity.schimbare(MainActivity.java:57) 
                     at com.alg.amzar.spectrum.MainActivity.onCreate(MainActivity.java:31) 
                     at android.app.Activity.performCreate(Activity.java:5343) 
                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088) 
                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2335) 
                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2433)  
                     at android.app.ActivityThread.access$800(ActivityThread.java:155)  
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1346)  
                     at android.os.Handler.dispatchMessage(Handler.java:110)  
                     at android.os.Looper.loop(Looper.java:193)  
                     at android.app.ActivityThread.main(ActivityThread.java:5341)  
                     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:830)  
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:646)  
                     at dalvik.system.NativeStart.main(Native Method)  

Мой телефон Android Версия: 4.4.2 (API 19) Target SDK Версия: "19" MinSDK Версия: "14"

SongAdapter.java:

package com.alg.amzar.spectrum; 

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

import java.util.ArrayList; 



public class SongAdapter extends BaseAdapter { 

private ArrayList<Song> songs; 
private LayoutInflater songInf; 

public SongAdapter(Context c, ArrayList<Song> theSongs) { 
    songs = theSongs; 
    songInf = LayoutInflater.from(c); 
} 

@Override 
public int getCount() { 
    return songs.size(); 
} 

@Override 
public Object getItem(int arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public long getItemId(int arg0) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    //map to song layout 
    LinearLayout songLay = (LinearLayout)songInf.inflate 
      (R.layout.song, parent, false); 
    //get title and artist views 
    TextView songView = (TextView)songLay.findViewById(R.id.song_title); 
    //get song using position 
    Song currSong = songs.get(position); 
    //get title and artist strings 
    songView.setText(currSong.getTitle()); 
    //set position as tag 
    songLay.setTag(position); 
    return songLay; 
} 

} 
+0

Пожалуйста, дайте андроиде версию телефона вы тестирование с и целенаправленной версией приложения –

+0

вы должны отлаживать приложение, идти построчно и увидеть, где находится проблема. – avinesh

ответ

2

В вашем случае findViewById(R.id.imagine) возвращает NULL, потому что он не существует в макете «activity_main», который вы указали в setContentView(). findViewById() возвращает NULL, если представление не существует в текущем макете. R.id.imagine существует в макете song.xml.

Думаю, вы пытаетесь раздуть ListView с помощью композиции «song». Только после раздувания вы можете позвонить findViewById и setImageResource. Вы можете сделать это в классе SongAdapter, для каждого элемента в ListView после их раздувания.

Другое предложение, вместо использования случайных изображений вы можете получить обложку альбома из класса MediaMetadataRetriever. Для этого вы можете обратиться к документации по Android.Но вы должны решить это исключение раньше.

Комментарий/Удалить функцию schimbare() в onCreate и edit SongAdapter, как показано ниже.

package com.alg.amzar.spectrum; 

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

import java.util.ArrayList; 



public class SongAdapter extends BaseAdapter { 

private ArrayList<Song> songs; 
private LayoutInflater songInf; 

int[] photos={R.drawable.img_0, R.drawable.img_1,R.drawable.img_2}; 
Random ran=new Random(); 
// CHECK THIS: 
public SongAdapter(Context c, ArrayList<Song> theSongs) { 
    songs = theSongs; 
    // CHECK THIS: 
    songInf = (LayoutInflater)c. 
       getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public int getCount() { 
    return songs.size(); 
} 

@Override 
public Object getItem(int arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public long getItemId(int arg0) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    //map to song layout 
    LinearLayout songLay = (LinearLayout)songInf.inflate 
      (R.layout.song, null); 
    //get title and artist views 
    TextView songView = (TextView)songLay.findViewById(R.id.song_title); 
    // CHECK THIS: 
    ImageView img = (ImageView)songLay.findViewById(R.id.imagine); 
    //get song using position 
    Song currSong = songs.get(position); 
    //get title and artist strings 
    songView.setText(currSong.getTitle()); 
    // CHECK THIS: 
    int i=ran.nextInt(photos.length); 
    img.setImageResource(photos[i]); 
    //set position as tag 
    songLay.setTag(position); 
    return songLay; 
} 

} 
+0

Я не могу правильно понять, что делать в этом случае. Во-первых, я хотел сделать с MediaMetadatRetriever, но для меня это немного сложно. –

+0

Вы должны вызвать 'setImageResourse' в классе SongAdapter. Я предоставлю вам ссылку: [link] (https://www.caveofprogramming.com/guest-posts/custom-listview-with-imageview-and-textview-in-android.html). Пожалуйста, попробуйте это. – 123rgt

+0

Вы должны исправить текущее исключение перед попыткой MediaMetadataRetriever. Это не является исключением для текущего исключения. – 123rgt

0

Устаревшее означает, что Google больше не поддерживает этот метод, сообщая вам, что существует метод NEWER, который вы должны использовать. устаревший метод работает нормально НА СЕЙЧАС. Но однажды (может быть, завтра, может быть, через 3 года с сегодняшнего дня) он больше не будет работать.

об ошибке, загрузите журнал, пожалуйста.

Ошибка в строке 57:

                 at com.alg.amzar.spectrum.MainActivity.schimbare(MainActivity.java:57)

Я не уверен, где линия 57, но вы можете проверить это в вашем коде, если вы до сих пор не могу найти причину, то обновление нам какая линия 57

public void schimbare() { 
 
    int[] photos={R.drawable.img_0, R.drawable.img_1,R.drawable.img_2}; 
 

 
    ImageView image = (ImageView) findViewById(R.id.imagine); 
 

 
    Random ran=new Random(); 
 

 
    // CHANGE photos.length to photos.length-1 
 
    int i=ran.nextInt(photos.length); 
 

 
    //ADD this 2 line of code below, then you can check in your Log if the problem is with the view (the view is null), or if the photos position is null. 
 

 
    Log.d("bug_tag",String.valueOf(photos[i])); 
 
    Log.d("bug_tag",String.valueOf(image.getId())); 
 

 

 
    image.setImageResource(photos[i]); 
 
}

+0

Я добавил журнал –

+0

Я все еще не могу его настроить. Проблема в том, где я думал изначально. Строка 57: image.setImageResource (фотографии [i]); –

+0

Проверьте комментарии в добавленном мной коде. –

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