2013-09-26 3 views
0

저는 Java에서 녹슬었고 Android에 익숙하지 않아서 MainActivity 클래스에 모두 포함되어 있으면 완벽하게 작동하는 코드를 조합했습니다. 하지만 이제는 코드를보기 좋게 만들기 위해 함수를 정리하여 클래스에 넣기를 원합니다. 다음은 내가하려는 일의 예입니다. IDE에서 오류가 발생하지는 않지만 MainActivity가 setArtist 및 setAlbum 함수를 실행하려고하면 장치가 충돌합니다.Android의 새로운 클래스에 문제가 있습니다.

public class MainActivity extends Activity { 

private ListView lv; 
String path, selectedFromList; 
ArrayAdapter<String> adapter; 
public ViewFiller k = new ViewFiller(); 

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

    lv = (ListView) findViewById(R.id.listView1); 

    k.setArtist(); 
    k.setAlbums(); 

    adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, k.getAlbums()); 
    lv.setAdapter(adapter); 

    ImageButton albumButton = (ImageButton) findViewById(R.id.albumButton); 
    ImageButton artistButton = (ImageButton) findViewById(R.id.artistButton); 

    albumButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      k.album(lv, adapter); 
     } 
    }); 

    artistButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      k.artist(lv, adapter); 
     } 
    }); 

} 

}

그리고 heres는 클래스 클래스 난에 문제가 ...가 오전

public class ViewFiller extends MainActivity { 

public ViewFiller(){ 
    } 

ArrayList<String> Albums = new ArrayList<String>(); 
ArrayList<String> Artist = new ArrayList<String>(); 
LinkedHashSet<String> hs = new LinkedHashSet<String>(); 

public ArrayList<String> getAlbums() { 
    return Albums; 
} 

public void setAlbums() { 

    String selection = AudioColumns.IS_MUSIC + " != 0"; 
    String[] projection = { BaseColumns._ID, AudioColumns.ALBUM }; 
    Cursor c = this.getContentResolver().query(
      MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, 
      selection, null, null); 

    while (c.moveToNext()) { 
     Albums.add(c.getString(1)); 
    } 
    hs.clear(); 
    hs.addAll(Albums); 
    Albums.clear(); 
    Albums.addAll(hs); 
} 


public ArrayList<String> getArtist() { 
    return Artist; 
} 

public void setArtist() { 

    String selection = AudioColumns.IS_MUSIC + " != 0"; 
    String[] projection = { BaseColumns._ID, AudioColumns.ARTIST, }; 
    Cursor c = this.getContentResolver().query(
      MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, 
      selection, null, null); 

    while (c.moveToNext()) { 
     Artist.add(c.getString(1)); 
    } 

    hs.clear(); 
    hs.addAll(Artist); 
    Artist.clear(); 
    Artist.addAll(hs); 
} 

public void artist(ListView lv, ArrayAdapter<String> s) { 
    lv.setAdapter(null); 
    s = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, Artist); 
    lv.setAdapter(s); 
} 

public void album(ListView lv, ArrayAdapter<String> s) { 
    lv.setAdapter(null); 
    s = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, Albums); 
    lv.setAdapter(s); 

} 

}

+0

LogCat 오류를 보내주세요. –

+0

ViewFiller가 MainActivity를 확장하는 이유는 무엇입니까? 이 프로그램의 목적을 말씀해 주시겠습니까? – ujvl

+0

음악 플레이어를 만드는 것은 앨범과 아티스트 이름으로 ListView를로드하는 코드입니다. MainActivity를 확장 한 이유를 알지 못했습니다. 정의되지 않은 ContentResolver와 관련된 오류를 없애는 유일한 방법이었습니다. – Xearo

답변

1

난 당신이 ViewFiller이 활동되고 싶은 생각하지 않는다 ...하지만 나는 틀릴 수도 있습니다. 만약 당신이 기본 액티비티에 의해 사용되는 어떤 객체를 생성하기 위해 사용하고있는 정규 클래스이고 MainActivity에 대한 접근이 필요하다면 객체의 생성자에 컨텍스트를 넘기면됩니다.

편집 :

Activity activity; 
public ViewFiller(Activity activity){ 
    this.activity = activity; 
} 
:

이 (내가 완전히 잘못, 죄송 수 있습니다) 난 너무 안드로이드와 약간 녹슨, 그래서 그것이 작동 있을지 잘 모르겠어요,이 같은 시도

하고 ... 대신 this.getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selection, null, null);의,

시도 :

activity.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selection, null, null);

그리고 주 활동 내역 : ViewFiller k = new ViewFiller(this);

그러나 이것이 원하는 것인지 확실하지 않습니다. 그래서 내가 어딘가 잘못하면 사과드립니다.

+0

예! 도와 주셔서 감사합니다. – Xearo

관련 문제